第二次作业是二元线性回归,需要利用梯度下降方法拟合得到最优的(w1,w2,b),并且画出基于参数w1和w2的等高线以及你梯度下降的每一步(用小箭头表示)。发布的数据集(dataset.txt)第一行为x1,第二行为x2,第三行为y,帮我写出它的代码
时间: 2024-09-10 21:03:12 浏览: 54
17.4.12(梯度下降,二元线性回归)1
在Python中,你可以使用`numpy`处理数值计算,`matplotlib`绘制图形,以及`sklearn`的数据读取。以下是使用梯度下降法做二元线性回归的基本代码示例。假设`dataset.txt`的格式已按照说明:
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import loadtxt
# 读取数据集
data = loadtxt('dataset.txt', delimiter=',') # 分割符设为逗号
X = data[:, :2] # x1 和 x2 的数据
y = data[:, 2] # y 数据
# 初始化参数
w1, w2, b = 0., 0., 0.
learning_rate = 0.01
num_iterations = 1000
# 梯度下降算法
def gradient_descent(X, y, w1, w2, b):
m = X.shape[0]
dw1, dw2, db = 0., 0., 0.
for i in range(m):
error = y[i] - (w1 * X[i][0] + w2 * X[i][1] + b)
dw1 -= error * X[i][0] / m
dw2 -= error * X[i][1] / m
db -= error / m
return dw1, dw2, db
# 训练过程
for _ in range(num_iterations):
dw1, dw2, db = gradient_descent(X, y, w1, w2, b)
w1 -= learning_rate * dw1
w2 -= learning_rate * dw2
b -= learning_rate * db
# 绘制等高线和梯度下降路径
# 这里需要对X增加一个列来包含1的偏置项
X_with_bias = np.c_[np.ones((len(X), 1)), X]
# 等高线
levels = np.arange(min(y) - 1, max(y) + 1, 0.5)
contour = plt.contourf(X_with_bias[:, 1:], y, levels, cmap='coolwarm')
plt.colorbar(contour)
# 梯度下降箭头表示
arrow_points = [(w1, w2, 'r'), (w1 + learning_rate * dw1, w2 + learning_rate * dw2, 'g')]
plt.quiver(X_with_bias[:10, 1], X_with_bias[:10, 0], arrow_points[0][0], arrow_points[0][1], color=arrow_points[0][2])
plt.plot(arrow_points[0][0], arrow_points[0][1], 'ro')
plt.plot(arrow_points[1][0], arrow_points[1][1], 'go')
# 其他点的箭头可以类似操作
for point in zip(X_with_bias, [dw1, dw1 + learning_rate * dw1]):
plt.plot(point[0][1], point[0][0], 'bo')
plt.quiver(*point, learning_rate, 0, color='blue')
plt.xlabel('w1')
plt.ylabel('w2')
plt.title('二元线性回归 - 梯度下降路径及等高线图')
plt.grid(True)
plt.show()
阅读全文