最小二乘法
最小二乘法是一种在统计学、数学、工程学和计算机科学等领域广泛使用的优化方法。
基本原理
最小二乘法的主要目的是找到一组模型参数,使得根据这些参数所预测的数据与实际观测数据之间的差异(即残差)的平方和最小。
数学表达
对于线性模型 y = ax + b,最小二乘问题可以表示为求解以下优化问题:
min a , b ∑ i = 1 n ( y i − ( a x i + b ) ) 2 \min_{a, b} \sum_{i=1}^{n} (y_i - (ax_i + b))^2 a,bmini=1∑n(yi−(axi+b))2
求解步骤
- 模型建立:首先确定模型形式,比如线性模型、多项式模型等。
- 参数估计:通过求解上述优化问题来估计模型参数。对于线性模型,这通常涉及到求解正规方程组或使用矩阵方法(如QR分解)。
- 模型评估:使用决定系数 R^2、残差分析等方法来评估模型的拟合优度。
应用
最小二乘法在各种领域都有应用,包括但不限于:
- 统计学:用于参数估计和假设检验。
- 工程学:在信号处理、系统识别中用于模型拟合。
- 经济学:用于经济数据的回归分析。
- 计算机视觉:在图像处理和机器学习中用于拟合数据模型。
最小二乘法因其简单直观且在许多情况下能给出良好的结果而被广泛使用。然而,它也有局限性,比如对异常值敏感、需要模型假设等。
python代码实现
import numpy as np
def least_squares(X, y):
# X 是特征矩阵,y 是目标向量
# 计算系数
theta_best = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
# 计算代价函数
y_pred = X.dot(theta_best)
cost = ((y_pred - y) ** 2).sum()
return theta_best, cost
# 示例使用
# 假设我们有以下数据
X = np.array([[1, 1], [1, 2], [1, 3]])
y = np.array([2, 4, 6])
# 使用最小二乘法
theta_best, cost = least_squares(X, y)
print("最佳系数:", theta_best)
print("代价函数值:", cost)
这个Python函数least_squares计算线性模型的系数,以最小化预测值与实际值之间的平方误差。它接受两个输入参数:
X: 一个2维NumPy数组或Pandas DataFrame,表示特征矩阵,形状为(n_samples, n_features)。
y: 一个1维NumPy数组或Pandas Series,表示目标向量,形状为(n_samples,)。
函数通过计算特征矩阵X的转置与X的乘积,再与X的转置相除,得到系数矩阵。然后,通过计算预测值y_pred与实际值y之间的平方误差,计算出模型的代价函数。
这个函数可以与NumPy和其他库(如NumPy和SciPy)一起使用,以在数据集上执行线性回归。还可以使用scikit-learn库,它提供了更友好的用户界面,用于机器学习任务,如线性回归。
在最小二乘法中,系数 theta_best
是通过求解正规方程(Normal Equation)得到的。正规方程的形式如下:
θ best = ( X T X ) − 1 X T y \theta_{\text{best}} = (X^TX)^{-1}X^Ty θbest=(XTX)−1XTy
这里:
在Python中,我们通常使用 numpy
库来计算这个解,因为 numpy
提供了方便的线性代数运算功能。以下是如何使用 numpy
来计算 theta_best
的示例代码:
import numpy as np
# 假设 X 是特征矩阵,y 是目标值向量
X = np.array([[1, 1], [1, 2], [1, 3]]) # 示例数据
y = np.array([2, 4, 6]) # 示例数据
# 添加一列1s到X,以便于包含截距项
X_b = np.c_[np.ones((X.shape[0], 1)), X]
# 计算正规方程的解
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print("最佳系数:", theta_best)
在这段代码中:
- 我们首先将特征矩阵
X
转换为X_b
,通过添加一列1s来包含截距项(即 ( \theta_0 ))。 - 然后,我们使用
np.linalg.inv()
来计算 ( (X_b^TX_b) ) 的逆矩阵。 - 接着,我们计算 ( (X_bTX_b){-1}X_b^T )。
- 最后,我们通过乘以目标值向量
y
来得到最佳系数theta_best
。
这样,我们就得到了最小化代价函数的系数向量 theta_best
。