Bird
Raised Fist0
SciPydata~10 mins

Least squares (least_squares) in SciPy - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Least squares (least_squares)
Define model function f(x, params)
Provide data points (x, y)
Define residuals: difference between f(x, params) and y
Call scipy.optimize.least_squares with residuals
Algorithm iteratively adjusts params
Stop when residuals minimized
Return best-fit parameters
The process fits a model to data by minimizing the difference between predicted and actual values using iterative optimization.
Execution Sample
SciPy
import numpy as np
from scipy.optimize import least_squares

def model(x, p):
    return p[0] * x + p[1]

x = np.array([0, 1, 2, 3])
y = np.array([1, 3, 5, 7])

res = least_squares(lambda p: model(x, p) - y, x0=[0, 0])
print(res.x)
Fits a line y = p0*x + p1 to points (x, y) by minimizing residuals.
Execution Table
StepParameters pResiduals (model(x,p)-y)Cost (sum squares)Action
1[0, 0][-1, -3, -5, -7]84Initial guess, calculate residuals and cost
2[1, 0][-1, -2, -3, -4]30Update p0 to 1, recalc residuals and cost
3[1, -1][0, -1, -2, -3]14Update p1 to -1, cost decreases
4[1, 1][-2, -3, -4, -5]54Update p1 to 1, cost increases, revert
5[2, 1][0, 0, 0, 0]0Update p0 to 2, perfect fit
6[2, 1][0, 0, 0, 0]0No improvement, minimal cost reached
7[2, 1][0, 0, 0, 0]0Algorithm converges to best parameters
Exit[2, 1][0, 0, 0, 0]0Stop: minimum cost found or max iterations reached
💡 Algorithm stops when cost no longer decreases significantly or max iterations reached.
Variable Tracker
VariableStartAfter 1After 2After 3After 4After 5Final
p[0, 0][1, 0][1, -1][1, 1][2, 1][2, 1][2, 1]
Cost84301454000
Key Moments - 2 Insights
Why does the cost increase when parameters change from [1, -1] to [1, 1]?
Because the residuals get larger, increasing the sum of squares cost, as shown in execution_table row 4 where cost jumps from 14 to 54.
Why does the algorithm revert parameter changes that increase cost?
The algorithm tries to minimize cost, so if a parameter update increases cost, it rejects that update and tries a different direction, as seen in row 4.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2, what is the cost value?
A54
B84
C30
D14
💡 Hint
Check the 'Cost (sum squares)' column at step 2 in the execution_table.
At which step does the algorithm first try parameters [1, 1]?
AStep 4
BStep 5
CStep 3
DStep 6
💡 Hint
Look at the 'Parameters p' column in the execution_table to find when [1, 1] appears.
If the initial guess was [2, 1], what would be the initial cost?
A30
B0
C84
D14
💡 Hint
Refer to the cost value when parameters are [2, 1] in the execution_table rows 5 and 6.
Concept Snapshot
Use scipy.optimize.least_squares to fit model parameters by minimizing residuals.
Define a model function and residuals (model - data).
Provide initial guess for parameters.
Algorithm iteratively updates parameters to reduce sum of squared residuals.
Stops when improvement is minimal or max iterations reached.
Returns best-fit parameters in res.x.
Full Transcript
This visual execution shows how least squares fitting works using scipy.optimize.least_squares. We start with a model function and data points. We define residuals as the difference between model predictions and actual data. The algorithm begins with an initial guess for parameters and calculates residuals and cost (sum of squared residuals). It then tries to update parameters to reduce cost. If cost increases, it reverts changes and tries other directions. This process repeats until the cost stops decreasing significantly or maximum iterations are reached. The final parameters minimize the difference between model and data.

Practice

(1/5)
1. What is the main purpose of using scipy.optimize.least_squares in data science?
easy
A. To find the best fit parameters by minimizing the difference between model predictions and data
B. To sort data points in ascending order
C. To calculate the mean of a dataset
D. To generate random numbers for simulations

Solution

  1. Step 1: Understand the purpose of least squares

    Least squares is used to find parameters that minimize the error between a model and observed data.
  2. Step 2: Match the purpose with the options

    Only To find the best fit parameters by minimizing the difference between model predictions and data describes minimizing differences to find best fit parameters.
  3. Final Answer:

    To find the best fit parameters by minimizing the difference between model predictions and data -> Option A
  4. Quick Check:

    Least squares = minimize error [OK]
Hint: Least squares minimizes errors to fit data best [OK]
Common Mistakes:
  • Confusing least squares with sorting or averaging
  • Thinking it generates random data
  • Assuming it calculates statistics like mean
2. Which of the following is the correct way to call scipy.optimize.least_squares with a residual function fun and initial guess x0?
easy
A. least_squares(fun=x0, x0=fun)
B. least_squares(x0, fun)
C. least_squares(fun, x0)
D. least_squares(x0)

Solution

  1. Step 1: Recall the function signature

    The correct call is least_squares(fun, x0) where fun is the residual function and x0 is the initial guess.
  2. Step 2: Check each option

    least_squares(fun, x0) matches the correct order and parameters. Others have wrong order or missing arguments.
  3. Final Answer:

    least_squares(fun, x0) -> Option C
  4. Quick Check:

    Function first, initial guess second [OK]
Hint: Function first, initial guess second in least_squares call [OK]
Common Mistakes:
  • Swapping the order of arguments
  • Passing only one argument
  • Using keyword arguments incorrectly
3. What will be the output of this code snippet?
import numpy as np
from scipy.optimize import least_squares

def residuals(x):
    return np.array([2*x[0] - 4, x[1] + 3])

result = least_squares(residuals, x0=[0, 0])
print(result.x)
medium
A. [-2.0, 3.0]
B. [4.0, 3.0]
C. [0.0, 0.0]
D. [2.0, -3.0]

Solution

  1. Step 1: Understand the residual function

    The residuals are [2*x0 - 4, x1 + 3]. We want to find x that makes residuals close to zero.
  2. Step 2: Solve equations for zero residuals

    Set 2*x0 - 4 = 0 => x0 = 2; and x1 + 3 = 0 => x1 = -3.
  3. Final Answer:

    [2.0, -3.0] -> Option D
  4. Quick Check:

    Zero residuals at x=[2, -3] [OK]
Hint: Set residuals to zero and solve for variables [OK]
Common Mistakes:
  • Not solving residual equations correctly
  • Confusing signs in equations
  • Assuming initial guess is the answer
4. Identify the error in this code using least_squares:
import numpy as np
from scipy.optimize import least_squares

def residuals(x):
    return 2*x - 5

result = least_squares(residuals, x0=3)
print(result.x)
medium
A. Initial guess x0 should be a list or array, not a scalar
B. Residual function returns a scalar instead of an array
C. Missing import statement for numpy
D. least_squares requires a Jacobian function

Solution

  1. Step 1: Check residual function output

    The residual function returns 2*x - 5, which is a scalar, but least_squares expects an array-like residual.
  2. Step 2: Verify other parts

    x0 as scalar is allowed; numpy is imported; Jacobian is optional.
  3. Final Answer:

    Residual function returns a scalar instead of an array -> Option B
  4. Quick Check:

    Residuals must be array-like [OK]
Hint: Residuals must be array, not single number [OK]
Common Mistakes:
  • Returning scalar residual instead of array
  • Thinking initial guess must be array
  • Assuming Jacobian is mandatory
5. You have noisy data points for a line: x = [0,1,2,3], y = [1.1, 2.0, 2.9, 4.2]. Using least_squares, which residual function best fits a line model y = m*x + c to estimate m and c?
hard
A. def residuals(p): return y - (p[0]*x + p[1])
B. def residuals(p): return p[0]*x + p[1]
C. def residuals(p): return (p[0]*x + p[1]) * y
D. def residuals(p): return y / (p[0]*x + p[1])

Solution

  1. Step 1: Understand residuals for least squares

    Residuals are differences between observed y and model predictions m*x + c.
  2. Step 2: Check residual function forms

    def residuals(p): return y - (p[0]*x + p[1]) returns y - model prediction (m*x + c), the standard residuals to minimize. def residuals(p): return p[0]*x + p[1] returns only the model predictions without subtracting y, so it minimizes the sum of squared model values instead of fitting errors.
  3. Step 3: Eliminate incorrect options

    Options C and D multiply or divide, which is incorrect for residuals.
  4. Final Answer:

    def residuals(p): return y - (p[0]*x + p[1]) -> Option A
  5. Quick Check:

    Residual = observed - predicted [OK]
Hint: Residual = observed minus predicted values [OK]
Common Mistakes:
  • Using multiplication or division instead of subtraction
  • Forgetting to subtract the observed values
  • Ignoring residuals should be array differences