欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

梯度下降预测房价

程序员文章站 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