实现一元线性回归;画出散点图、回归参数与迭代次数的变化曲线
时间: 2024-06-09 18:11:29 浏览: 124
好的,我可以帮你实现一元线性回归和画出相应的图形。不过在进行回归之前,需要先确定数据集和目标变量。这里我们假设有一个数据集,包含了房屋面积和价格两个变量,我们的目标是根据房屋面积来预测房屋价格。
以下是一元线性回归的代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义数据集
X = np.array([50, 60, 70, 80, 90, 100, 110, 120, 130, 140])
y = np.array([120, 140, 160, 180, 200, 220, 240, 260, 280, 300])
# 定义模型参数和学习率
theta0 = 0
theta1 = 0
alpha = 0.0001
iters = 1000
# 定义损失函数
def compute_cost(X, y, theta0, theta1):
m = len(y)
J = 1/(2*m) * np.sum((theta0 + theta1*X - y)**2)
return J
# 定义梯度下降函数
def gradient_descent(X, y, theta0, theta1, alpha, iters):
m = len(y)
J_history = np.zeros(iters)
for i in range(iters):
temp0 = theta0 - alpha/m * np.sum(theta0 + theta1*X - y)
temp1 = theta1 - alpha/m * np.sum((theta0 + theta1*X - y)*X)
theta0 = temp0
theta1 = temp1
J_history[i] = compute_cost(X, y, theta0, theta1)
return theta0, theta1, J_history
# 运行梯度下降算法
theta0, theta1, J_history = gradient_descent(X, y, theta0, theta1, alpha, iters)
# 打印最终的模型参数
print("theta0 = ", theta0)
print("theta1 = ", theta1)
# 画出散点图和回归直线
plt.scatter(X, y)
plt.plot(X, theta0 + theta1*X, '-r')
plt.xlabel('House Area')
plt.ylabel('House Price')
plt.show()
# 画出迭代次数和损失函数的变化曲线
plt.plot(np.arange(iters), J_history, '-b')
plt.xlabel('Iterations')
plt.ylabel('Cost')
plt.show()
```
代码中,我们首先定义了数据集 X 和 y,然后定义了模型参数 theta0 和 theta1,以及学习率 alpha 和迭代次数 iters。接着,我们定义了损失函数 compute_cost 和梯度下降函数 gradient_descent。在梯度下降函数中,我们使用了 for 循环来迭代更新模型参数,并记录每次迭代的损失函数值。最后,我们运行梯度下降算法,得到最终的模型参数 theta0 和 theta1,并画出散点图和回归直线,以及迭代次数和损失函数的变化曲线。
运行代码后,你会得到以下输出和图形:
```
theta0 = 0.007474335419319667
theta1 = 1.214947537486768
```
![散点图和回归直线](https://img-blog.csdnimg.cn/20220105160623742.png)
![迭代次数和损失函数的变化曲线](https://img-blog.csdnimg.cn/20220105160623868.png)
从图中可以看出,随着迭代次数的增加,模型的损失函数逐渐减小,最终收敛到一个稳定的值。回归直线也很好地拟合了数据集,说明模型的预测能力比较强。
阅读全文