线性回归预测房价

给定数据集dataSet,每一行代表一组数据记录,每组数据记录中,第一个值为房屋面积(单位:平方英尺),第二个值为房屋中的房间数,第三个值为房价(单位:千美元),试用梯度下降法,构造损失函数,在函数gradientDescent中实现房价price关于房屋面积area和房间数rooms的线性回归,返回值为线性方程 price = θ 0 \theta_0 θ0+ θ 1 \theta_1 θ1∗area+ θ 2 \theta_2 θ2∗rooms 中系数 θ i \theta_i θi(?=0,1,2) 的列表

思路:
我们将用梯度下降法来拟合出这条直线!
首先,我们需要定义一个代价函数,在此我们选用均方误差代价函数
J ( θ ) = 1 2 m ∑ i = 1 m h θ ( x ( i ) − y ( i ) ) 2 J(\theta) = \frac {1}{2m}\sum_{i=1}^{m}{h_{\theta}(x^{(i)}-y^{(i)})^2} J(θ)=2m1i=1mhθ(x(i)y(i))2

  • m是数据集中点的个数
  • 1 2 \frac {1}{2} 21是一个常量,这样是为了在求梯度的时候,二次方乘下来就和这里的 1 2 \frac {1}{2} 21抵消了,自然就没有多余的常数系数,方便后续的计算,同时对结果不会有影响
  • y 是数据集中每个点的真实y坐标的值
  • h 是我们的预测函数,根据每一个输入x,根据 θ \theta θ 计算得到预测的y值,即
    h θ ( x ( i ) ) = θ 0 + θ 1 x 1 ( i ) h_{\theta}(x^{(i)})= \theta_0 + \theta_1x_1^{(i)} hθ(x(i))=θ0+θ1x1(i)

本题的 h θ ( x ( i ) ) h_{\theta}(x^{(i)}) hθ(x(i))函数为 price = θ 0 \theta_0 θ0+ θ 1 \theta_1 θ1∗area+ θ 2 \theta_2 θ2∗rooms
我们可以根据代价函数看到,代价函数中的变量有三个( θ 0 , θ 1 , θ 2 \theta_0,\theta_1,\theta_2 θ0θ1θ2),所以是一个多变量的梯度下降问题,求解出代价函数的梯度,也就是分别对三个变量进行微分
∇ J ( θ ) = ⟨ ∂ J ∂ θ 0 , ∂ J ∂ θ 1 , ∂ J ∂ θ 2 ⟩ \nabla J(\theta) = \langle \frac{\partial J}{\partial \theta_0} ,\frac{\partial J}{\partial \theta_1},\frac{\partial J}{\partial \theta_2} \rangle J(θ)=θ0J,θ1J,θ2J
∂ J ∂ θ 0 = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) \frac{\partial J}{\partial \theta_0} = \frac{1}{m}\sum_{i=1}^m ({h_{\theta(x^{(i)})-y^{(i)}})} θ0J=m1i=1m(hθ(x(i))y(i))
∂ J ∂ θ 1 = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 1 ( i ) \frac{\partial J}{\partial \theta_1} = \frac{1}{m}\sum_{i=1}^m {(h_{\theta(x^{(i)})-y^{(i)}})}x_1^{(i)} θ1J=m1i=1m(hθ(x(i))y(i))x1(i)
∂ J ∂ θ 2 = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 2 ( i ) \frac{\partial J}{\partial \theta_2} = \frac{1}{m}\sum_{i=1}^m {(h_{\theta(x^{(i)})-y^{(i)}})}x_2^{(i)} θ2J=m1i=1m(hθ(x(i))y(i))x2(i)

这个表达式 的意思就是 求 θ \theta θ的偏导 就是先将预测值 h θ ( x ( i ) ) h_{\theta}(x^{(i)}) hθ(x(i))减去实际的值 y ( i ) y^{(i)} y(i)乘以偏移量 x ( i ) x^{(i)} x(i) 的总和加起来除以所有的组数。
明确了代价函数和梯度,以及预测的函数形式。我们就可以开始编写代码了。
每次迭代时,都会有 θ \theta θ = θ \theta θ - ∂ J ∂ θ \frac{\partial J}{\partial \theta} θJ*lr (learning rate),经过n次迭代后,最终梯度下降到最优解附近。此时,模型就训练成功。

首先确定这是一个三元线性回归问题,我们需要人为设置的参数有学习率learning rate,还有迭代的次数epchos。
实现该线性回归主要有三步:
第一步,获得要训练的数据,也就是房子的大小,房间数以及房子的价格
第二步:设置初始的三个未知数 θ 0 , θ 1 , θ 2 \theta_0,\theta_1,\theta_2 θ0,θ1,θ2的值,也就是线性方程的系数,刚开始,随机为1,2,1
第三步:根据设置的 θ 0 , θ 1 , θ 2 \theta_0,\theta_1,\theta_2 θ0,θ1,θ2的值,将相应的房间大小和房价数都放入函数中,求得一个预测的房价preditc_y。用预测的房价减去实际的房价,对他们的结果求平方,并将这n组数据求得的平方结果累加起来。来算一下损失函数(就是求均方差)。
每次预测完房子的价格,都将相应的 θ 0 , θ 1 , θ 2 \theta_0,\theta_1,\theta_2 θ0,θ1,θ2向真实的房价偏移,偏移量是(预测房价-真实房价)X 相应的参数(如果求 θ 0 \theta_0 θ0,那就是乘1,如果是 θ 1 \theta_1 θ1,那就乘area对应的值,如果是 θ 2 \theta_2 θ2,那就乘rooms对应的值),该偏移量是向上偏移(即函数中的系数 θ \theta θ值变大)还是向下偏移,取决于预测值predict_y是低于还是高于真实价格。
就这样一直进行偏移量操作,一直对 θ \theta θ进行迭代。

下面就上代码吧
导入库函数和数据

%matplotlib inline

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from numpy import genfromtxt
dataPath = r"./Input/data1.csv"
dataSet = pd.read_csv(dataPath,header=None)

price = []
rooms = []
area = []

for data in range(0,len(dataSet)):
    area.append(dataSet[0][data])
    rooms.append(dataSet[1][data])
    price.append(dataSet[2][data])

梯度下降核心代码

def gradientDescent(rooms, price, area):
    """
    梯度下降法。给定起始点与目标函数的一阶导数,求在epochs次迭代中theta0,theta1,theta2的更新值
    param theta0
    """
    theta = [1,2,1] #预设theta初值
    learn_rate = 0.0000000001 #学习率
    predit_y = 0 #预测值
    loss = [] #损失数组
    epochs = 5000 #迭代次数
    
    for j in range(epochs):
        theta0,theta1,theta2= 0,0,0
        loss_t = 0 #计算总体的方差
        for i in range(5):   #一共五组数据
            predit_y =  theta[0] + theta[1] * area[i] + theta[2]*rooms[i]
            theta0 = theta0 + (predit_y - price[i])*1
            theta1 = theta1 + (predit_y - price[i])*area[i]
            theta2 = theta2 + (predit_y - price[i])*rooms[i] 
            loss_t = loss_t + ((predit_y-price[i])**2)/2
        loss.append(loss/5)
        theta0 = theta0  / 5
        theta1 = theta1  / 5
        theta2 = theta2  / 5
        theta[0] = theta[0] - theta0*learn_rate
        theta[1] = theta[1] - theta1*learn_rate
        theta[2] = theta[2] - theta2*learn_rate
    plt.plot(loss,c='b')
    plt.show()
    return theta

主函数调用

def demo_GD():
    print("hello")
    gradientDescent(rooms,price,area)
demo_GD()

参考文章:

作者:六尺帐篷
链接:https://www.jianshu.com/p/c7e642877b0e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Philtell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值