# `Scholar.Linear.PolynomialRegression`
[🔗](https://github.com/elixir-nx/scholar/blob/main/lib/scholar/linear/polynomial_regression.ex#L1)

Least squares polynomial regression.

Time complexity of polynomial regression is $O((K^2) * (K+N))$ where $N$ is the number of samples and $K$ is the number of features.

# `fit`
[🔗](https://github.com/elixir-nx/scholar/blob/main/lib/scholar/linear/polynomial_regression.ex#L96)

Fits a polynomial regression model for sample inputs `x` and
sample targets `y`.

## Options

* `:sample_weights` - The weights for each observation. If not provided,
  all observations are assigned equal weight.

* `:degree` (`t:pos_integer/0`) - The degree of the feature matrix to return. Must be an integer equal or greater than 1. 1
  returns the input matrix. The default value is `2`.

* `:fit_intercept?` (`t:boolean/0`) - If set to `true`, a model will fit the intercept. Otherwise,
  the intercept is set to `0.0`. The intercept is an independent term
  in a linear model. Specifically, it is the expected mean value
  of targets for a zero-vector on input. The default value is `true`.

## Return Values

The function returns a struct with the following parameters:

  * `:coefficients` - Estimated coefficients for the polynomial regression problem.

  * `:intercept` - Independent term in the polynomial model.

## Examples

    iex> x = Nx.tensor([[1.0, 2.0], [3.0, 2.0], [4.0, 7.0]])
    iex> y = Nx.tensor([4.0, 3.0, -1.0])
    iex> model = Scholar.Linear.PolynomialRegression.fit(x, y, degree: 1)
    iex> model.coefficients
    #Nx.Tensor<
      f32[2]
      [-0.49724647402763367, -0.7010394930839539]
    >
    iex> model.intercept
    #Nx.Tensor<
      f32
      5.8964691162109375
    >
    iex> model.degree
    1

    iex> x = Nx.tensor([[1.0, 2.0], [3.0, 2.0], [4.0, 7.0]])
    iex> y = Nx.tensor([4.0, 3.0, -1.0])
    iex> model = Scholar.Linear.PolynomialRegression.fit(x, y, degree: 2)
    iex> model.coefficients
    #Nx.Tensor<
      f32[5]
      [-0.021396614611148834, -0.004854436963796616, -0.08849868923425674, -0.06221142038702965, -0.04369127005338669]
    >
    iex> model.intercept
    #Nx.Tensor<
      f32
      4.418517112731934
    >
    iex> model.degree
    2

# `predict`
[🔗](https://github.com/elixir-nx/scholar/blob/main/lib/scholar/linear/polynomial_regression.ex#L127)

Makes predictions with the given `model` on input `x`.

Output predictions have shape `{n_samples}` when train target is shaped either `{n_samples}` or `{n_samples, 1}`.
Otherwise, predictions match train target shape.

## Examples

    iex> x = Nx.tensor([[1.0, 2.0], [3.0, 2.0], [4.0, 7.0]])
    iex> y = Nx.tensor([4.0, 3.0, -1.0])
    iex> model = Scholar.Linear.PolynomialRegression.fit(x, y, degree: 2)
    iex> Scholar.Linear.PolynomialRegression.predict(model, Nx.tensor([[2.0, 1.0]]))
    #Nx.Tensor<
      f32[1]
      [3.8487606048583984]
    >

# `transform`
[🔗](https://github.com/elixir-nx/scholar/blob/main/lib/scholar/linear/polynomial_regression.ex#L177)

Computes the feature matrix for polynomial regression.

* `:degree` (`t:pos_integer/0`) - The degree of the feature matrix to return. Must be an integer equal or greater than 1. 1
  returns the input matrix. The default value is `2`.

* `:fit_intercept?` (`t:boolean/0`) - If set to `true`, a model will fit the intercept. Otherwise,
  the intercept is set to `0.0`. The intercept is an independent term
  in a linear model. Specifically, it is the expected mean value
  of targets for a zero-vector on input. The default value is `true`.

## Examples

    iex> x = Nx.tensor([[2]])
    iex> Scholar.Linear.PolynomialRegression.transform(x, degree: 0)
    ** (NimbleOptions.ValidationError) invalid value for :degree option: expected positive integer, got: 0

    iex> x = Nx.tensor([[2]])
    iex> Scholar.Linear.PolynomialRegression.transform(x, degree: 5, fit_intercept?: false)
    #Nx.Tensor<
      s32[1][5]
      [
        [2, 4, 8, 16, 32]
      ]
    >

    iex> x = Nx.tensor([[2, 3]])
    iex> Scholar.Linear.PolynomialRegression.transform(x)
    #Nx.Tensor<
      s32[1][6]
      [
        [1, 2, 3, 4, 6, 9]
      ]
    >

    iex> x = Nx.iota({3, 2})
    iex> Scholar.Linear.PolynomialRegression.transform(x, fit_intercept?: false)
    #Nx.Tensor<
      s32[3][5]
      [
        [0, 1, 0, 0, 1],
        [2, 3, 4, 6, 9],
        [4, 5, 16, 20, 25]
      ]
    >

---

*Consult [api-reference.md](api-reference.md) for complete listing*
