#根据公式自己编写回归程序 #最小二乘与梯度法均可 #建议两者均实现以对比 def my_linear_model(X_train, y_train, X_test): pass
时间: 2023-12-28 14:05:38 浏览: 26
好的,以下是根据公式自己编写回归程序的代码,包括最小二乘法和梯度下降法两种实现方式:
```python
import numpy as np
# 最小二乘法
def least_squares(X, y):
# 计算 w = (X^T X)^-1 X^T y
w = np.linalg.inv(X.T @ X) @ X.T @ y
return w
# 梯度下降法
def gradient_descent(X, y, lr=0.01, epochs=1000):
# 初始化 w 和 b 为 0
w = np.zeros((X.shape[1], 1))
b = 0
# 进行 epochs 次迭代
for i in range(epochs):
# 计算预测值 y_hat
y_hat = X @ w + b
# 计算误差 e
e = y_hat - y
# 计算梯度
dw = X.T @ e
db = np.sum(e)
# 更新参数
w -= lr * dw
b -= lr * db
return w, b
# 处理训练数据
X_train = np.array(X_train).reshape(-1, 1)
y_train = np.array(y_train).reshape(-1, 1)
# 计算 X 和 y 的均值
X_mean = np.mean(X_train)
y_mean = np.mean(y_train)
# 计算 X 和 y 的标准差
X_std = np.std(X_train)
y_std = np.std(y_train)
# 对 X 和 y 进行标准化
X_train = (X_train - X_mean) / X_std
y_train = (y_train - y_mean) / y_std
# 添加一列全为 1 的常数列
X_train = np.concatenate([np.ones((X_train.shape[0], 1)), X_train], axis=1)
# 计算参数 w
w_least_squares = least_squares(X_train, y_train)
w_gradient_descent, b_gradient_descent = gradient_descent(X_train, y_train)
# 处理测试数据
X_test = np.array(X_test).reshape(-1, 1)
# 对测试数据进行标准化
X_test = (X_test - X_mean) / X_std
# 添加一列全为 1 的常数列
X_test = np.concatenate([np.ones((X_test.shape[0], 1)), X_test], axis=1)
# 计算预测值 y_pred
y_pred_least_squares = X_test @ w_least_squares * y_std + y_mean
y_pred_gradient_descent = X_test @ w_gradient_descent * y_std + y_mean
# 输出预测值
print("最小二乘法预测结果:", y_pred_least_squares)
print("梯度下降法预测结果:", y_pred_gradient_descent)
```
在以上代码中,首先对训练数据进行了标准化处理,然后使用最小二乘法和梯度下降法分别求出了参数 w。接着,对测试数据进行了标准化处理,并使用求出的参数 w 对测试数据进行了预测,最后输出了预测结果。
希望这份代码可以帮到您!