### 关于最小二乘法的示例代码
以下是基于 Python 的简单线性回归最小二乘法实现,适用于一元线性回归问题:
```python
import numpy as np
import matplotlib.pyplot as plt
# 数据集定义
X = np.array([0, 1, 2, 3, 4, 5])
Y = np.array([1, 3, 2, 5, 7, 8])
# 计算斜率 (m) 和截距 (b)
n = len(X)
sum_x = np.sum(X)
sum_y = np.sum(Y)
sum_xy = np.sum(X * Y)
sum_xx = np.sum(X ** 2)
denominator = n * sum_xx - sum_x ** 2
numerator_m = n * sum_xy - sum_x * sum_y
numerator_b = sum_xx * sum_y - sum_x * sum_xy
m = numerator_m / denominator
b = numerator_b / denominator
print(f"拟合直线方程为 y = {m:.2f}x + {b:.2f}")
# 绘制图像
plt.scatter(X, Y, color="blue", label="原始数据点")
plt.plot(X, m*X + b, color="red", linewidth=2, label=f"拟合直线 y={m:.2f}x+{b:.2f}")
plt.legend()
plt.show()
```
上述代码实现了简单的最小二乘法拟合一元线性回归模型[^2]。
---
### 加权最小二乘法的实际应用案例
在某些情况下,不同观测值的重要性可能有所不同。例如,在处理噪声较大的实验数据时,可以通过加权最小二乘法赋予更可靠的数据更高的权重。以下是一个 SPSS 中的操作流程描述以及对应的 Python 实现方式[^3]。
#### Python 实现加权最小二乘法
假设我们有一组带权重的数据 `(X, Y)` 及其对应权重 `w`,则可以按照如下方式进行加权最小二乘拟合:
```python
import numpy as np
# 定义数据和权重
X = np.array([0, 1, 2, 3, 4, 5])
Y = np.array([1, 3, 2, 5, 7, 8])
weights = np.array([1, 2, 1, 3, 2, 1]) # 权重向量
# 构造设计矩阵 A 和目标向量 B
A = np.vstack([X, np.ones(len(X))]).T
B = Y
# 使用加权最小二乘公式 W @ A.T @ A 求解参数
W = np.diag(weights) # 对角阵形式表示权重
params = np.linalg.inv(A.T.dot(W).dot(A)).dot(A.T).dot(W).dot(B)
m_wls, b_wls = params[0], params[1]
print(f"加权最小二乘拟合结果: 斜率为 {m_wls}, 截距为 {b_wls}")
```
此方法通过引入权重矩阵 \( W \),使得重要性较高的样本对最终结果的影响更大。
---
### 随机梯度下降法的应用场景
对于大规模数据集,传统的批量梯度下降法可能会因为每次迭代都需要计算整个训练集而变得低效。因此,随机梯度下降法(SGD)成为一种替代方案。它仅使用单个样本更新模型参数,从而显著减少每轮迭代的时间开销[^1]。
#### SGD 示例代码
下面展示了一个简单的 SGD 方法用于线性回归的任务:
```python
import numpy as np
def sgd_linear_regression(X, Y, learning_rate=0.01, epochs=100):
m, b = 0, 0 # 初始化参数
n = len(X)
for _ in range(epochs):
for i in range(n): # 遍历每个样本
x_i, y_i = X[i], Y[i]
prediction = m * x_i + b
error = y_i - prediction
# 更新参数
m += learning_rate * (error * x_i)
b += learning_rate * error
return m, b
# 测试数据
X = np.array([0, 1, 2, 3, 4, 5])
Y = np.array([1, 3, 2, 5, 7, 8])
slope_sgd, intercept_sgd = sgd_linear_regression(X, Y)
print(f"SGD 结果: 斜率为 {slope_sgd}, 截距为 {intercept_sgd}")
```
这种方法特别适合处理超大数据集的情况,因为它不需要一次性加载所有数据到内存中。
---