暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

线性回归的基本知识

原创 watson 2022-10-30
523

本文用线性回归解决什么问题?

一个朋友最近找到我,说想去上海生活,要把武汉的房子卖掉,但是他不清楚行情,不知道自己的房子值多少钱,我是个热心肠,遇到这种事肯定不会袖手旁观,于是我想了个办法,决定帮他一把。

解决问题的关键有两个。

一是我必须拿到足够的当地房价销售数据,这个我可以找我的哥们铁子搞定,铁子在中国最大的房屋中介做区域经理,找他要一点数据应该不会太难。

二是需要基于这些销售数据,给出一个线性函数(当然是线性,因为我在讲线性回归),该函数有一个自变量x,x表示房屋的面积,函数值y代表房屋的成交价格,如以下公式。

y=f(x)y=f(x)

这样,我就可以把朋友房子的面积x代入以上函数进行计算,得到一个房价,这个价格是基于模型计算出的预估成交价格,之后把这个价格告诉朋友,让他挂出去的时候作为参考。

当然市场行为有非常多的偶然因素,比如朋友如果急着卖房,他最终的成交价肯定会低于我的预估价格,我们在学习线性回归时,不考虑这些非学术因素。

我觉得到目前为止,这个思路很棒,接下来,就开始行动了!

建立数据集

我马上给铁子拨了个电话。

”哥们,帮个忙,武汉地区的成交价格数据可以给点吗,我做个预测模型。”

铁子知道我是个技术控,平时吃饭聊天经常有一些稀奇古怪的想法,我一开口他就大概知道我又要鼓捣一些东西了。

”行,不过我们公司最近好像也在研究预测模型,你研究的好,可以给我提供点思路,稍候发你。”

铁子不愧是铁子,就是痛快。

于是,我拿到了以下数据。每行都代表一条销售记录,第一列代表房屋面积,第二列代表房屋成交价格。我用工具,画了一个平面图,这样数据看起来更加直观。

size:600,300

代码

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. if __name__ == '__main__':
  4. # 从数据集文件读取1、2列
  5. data = np.genfromtxt('train_hw.csv',delimiter=',',dtype='float',usecols=[0,1])
  6. x = data[::,1]
  7. y = data[::,0]
  8. fig, ax = plt.subplots(1, 1, figsize=(7,7))
  9. # 绘制散点图
  10. ax.scatter(x,y, s=20, c=x)
  11. ax.set_xlabel('Square size')
  12. ax.set_ylabel('Deal price')
  13. plt.show()

数据集

105,170
109,180
103,145
118,233
112,200
115,190
121,250
127,255
128,265
134,285
132,265
130,255
141,315
146,305
147,312
152,355
154,375
155,385
161,435
162,425
165,435

假设函数

销售数据已经搞定了,接下来要基于这些数据生成一个函数了,在机器学习中,这个函数又叫做假设函数,名字很形象,因为我们目前还不知道这个函数长什么样,所以需要先假设一个函数(有点类似列方程组时对未知变量以x,y代替),虽然我们不知道假设函数具体长什么样,但是我们知道它是一根直线,这里我们先写出方程。

f(x)=ax+bf(x)=ax+b

代价函数

将模型中的\theta_0θ0和\theta_1θ1作为自变量,得到以下函数

J(\theta_0,\theta_1)=\dfrac{1}{2m}\sum\limits_{i=1}^{M}(h_\theta(x^{(i)})-y^{(i)})^2J(θ0,θ1)=2m1i=1∑M(hθ(x(i))−y(i))2

线性回归 Linear regression model

a=ba=b

梯度下降 Gradient descent algorithm
(j=0,j=1)\theta_j = \theta_j-\alpha\dfrac{\delta}{\delta\theta_j}J(\theta_0,\theta_1)θj=θj−αδθjδJ(θ0,θ1)

求出偏导数\theta_0θ0

j=0: \dfrac{\delta}{\delta\theta_0}J(\theta_0,\theta_1)=\dfrac{\delta}{\delta\theta_0}\dfrac{1}{2m}\sum\limits_{i=1}^{M}(h_\theta(x^{(i)})-y^{(i)})^2δθ0δJ(θ0,θ1)=δθ0δ2m1i=1∑M(hθ(x(i))−y(i))2

=\dfrac{\delta}{\delta\theta_0}J(\theta_0,\theta_1)=\dfrac{\delta}{\delta\theta_0}\dfrac{1}{2m}\sum\limits_{i=1}^{M}(\theta_0+\theta_1x^{(i)}-y^{(i)})^2δθ0δJ(θ0,θ1)=δθ0δ2m1i=1∑M(θ0+θ1x(i)−y(i))2

=\dfrac{1}{m}\sum\limits_{i=1}^{M}(h_\theta(x^{(i)})-y^{(i)})m1i=1∑M(hθ(x(i))−y(i))

求出偏导数\theta_1θ1

j=1:\dfrac{\delta}{\delta\theta_1}J(\theta_0,\theta_1)=\dfrac{\delta}{\delta\theta_1}\dfrac{1}{2m}\sum\limits_{i=1}^{M}(h_\theta(x^{(i)})-y^{(i)})^2δθ1δJ(θ0,θ1)=δθ1δ2m1i=1∑M(hθ(x(i))−y(i))2

=\dfrac{\delta}{\delta\theta_1}J(\theta_0,\theta_1)=\dfrac{\delta}{\delta\theta_1}\dfrac{1}{2m}\sum\limits_{i=1}^{M}(\theta_0+\theta_1x^{(i)}-y^{(i)})^2δθ1δJ(θ0,θ1)=δθ1δ2m1i=1∑M(θ0+θ1x(i)−y(i))2

=\dfrac{1}{m}\sum\limits_{i=1}^{M}(h_\theta(x^{(i)})-y^{(i)})\cdot x^{(i)}m1i=1∑M(hθ(x(i))−y(i))⋅x(i)

将偏导数公式代入梯度下降公式

j=0: \theta_0=\theta_0-\dfrac{1}{m}\sum\limits_{i=1}^{M}(h_\theta(x^{(i)})-y^{(i)})θ0=θ0−m1i=1∑M(hθ(x(i))−y(i))

j=1: \theta_1=\theta_1-\dfrac{1}{m}\sum\limits_{i=1}^{M}(h_\theta(x^{(i)})-y^{(i)})\cdot x^{(i)}θ1=θ1−m1i=1∑M(hθ(x(i))−y(i))⋅x(i)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论