梯度下降预测房价
程序员文章站
2022-04-12 08:40:58
梯度下降预测房价题目:房屋价格与面积(数据在下面表格中)序号面积价格11506450220074503250845043009450535011450640015450760018450使用梯度下降求解线性回归(求0,1)要求:(1)对关键代码进行注释;(2)把每次迭代计算出来的theta0 ,theta1 画出来;(3)分别用随机梯度和批量梯度实现,并在同一个图形中进行对比(颜色不同)。python...
梯度下降预测房价
题目:
房屋价格与面积(数据在下面表格中)
序号 | 面积 | 价格 |
---|---|---|
1 | 150 | 6450 |
2 | 200 | 7450 |
3 | 250 | 8450 |
4 | 300 | 9450 |
5 | 350 | 11450 |
6 | 400 | 15450 |
7 | 600 | 18450 |
使用梯度下降求解线性回归(求0,1)
要求:
(1)对关键代码进行注释;
(2)把每次迭代计算出来的theta0 ,theta1 画出来;
(3)分别用随机梯度和批量梯度实现,并在同一个图形中进行对比(颜色不同)。
python代码:
import matplotlib.pyplot as plt
import random
import matplotlib
#输入数据
x = [150,200,250,300,350,400,600]
y = [6450,7450,8450,9450,11450,15450,18450]
#步长
alpha = 0.00001
#样本个数
m = 7
#初始化参数的值,函数为 y=theta0+theta1*x
ftheta0 = 0
ftheta1 = 0
gtheta1=0
gtheta0=0
#误差
error0=0
error1=0
#两次误差差值的阈值
epsilon=0.000001
def f(x):
return ftheta1*x+ftheta0
def g(x):
return gtheta1*x+gtheta0
#开始迭代批量梯度
fresult0 = []
fresult1 = []
while True:
diff = [0, 0]
# 梯度下降
for i in range(m):
diff[0] += f(x[i]) - y[i] # 对theta0求导
diff[1] += (f(x[i]) - y[i]) * x[i] # 对theta1求导
ftheta0 = ftheta0 - alpha / m * diff[0]
ftheta1 = ftheta1 - alpha / m * diff[1]
fresult0.append(ftheta0)
fresult1.append(ftheta1)
error1 = 0
# 计算误差的差值,小于阈值则退出迭代
for i in range(len(x)):
error1 += (y[i] - (ftheta0 + ftheta1 * x[i])) ** 2 / 2
if abs(error1 - error0) < epsilon:
break
else:
error0 = error1
#开始迭代随机梯度
gresult0 = []
gresult1 = []
for j in range(5000):
diff = [0, 0]
# 梯度下降
i = random.randint(0, m - 1)
diff[0] += g(x[i]) - y[i] # 对theta0求导
diff[1] += (g(x[i]) - y[i]) * x[i] # 对theta1求导
gtheta0 = gtheta0 - alpha / m * diff[0]
gtheta1 = gtheta1 - alpha / m * diff[1]
gresult0.append(gtheta0)
gresult1.append(gtheta1)
error1 = 0
# 计算两次误差的差值,小于阈值则退出迭代
for k in range(len(x)):
error1 += (y[i] - (gtheta0 + gtheta1 * x[i])) ** 2 / 2
if abs(error1 - error0) < epsilon:
break
else:
error0 = error1
#结果
print(ftheta1,ftheta0)
print(gtheta1,gtheta0)
#绘图
a=len(fresult0)
C=len(fresult1)
b=range(a)
c=range(C)
plt.plot(b,fresult0)
plt.xlabel("Runs")
plt.ylabel("theta0")
plt.show()
plt.plot(c,fresult1)
plt.xlabel("Runs")
plt.ylabel("theta1")
plt.show()
a1=len(gresult0)
C1=len(gresult1)
b1=range(a1)
c1=range(C1)
plt.plot(b1,gresult0)
plt.xlabel("Runs")
plt.ylabel("theta0")
plt.show()
plt.plot(c1,gresult1)
plt.xlabel("运行次数")
plt.ylabel("theta1")
plt.show()
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(x,[p(x) for x in x],label='批量梯度')
plt.plot(x,[s(x) for x in x],label='随机梯度')
plt.plot(x,y,'bo',label='数据')
plt.legend()
plt.show()
结果如下:
1.批量梯度:
theta1=28.778604659732547
theta0=1771.0428917695647
2.随机梯度:
theta1=12752.3407772289
theta0=3549.5689256100904
结果图:
本文地址:https://blog.csdn.net/qq_45944185/article/details/107303393