当前位置: 移动技术网 > IT编程>脚本编程>Python > 梯度下降预测房价

梯度下降预测房价

2020年07月14日  | 移动技术网IT编程  | 我要评论
梯度下降预测房价题目:房屋价格与面积(数据在下面表格中)序号面积价格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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网