美国房价问题
Alex经过一年的努力,终于拿到了美国波士顿麻省理工学院的研究生录取通知书,在远离家乡的地方上学,Alex想在波士顿买一套房子,他手头有一些积蓄,在网上找了几套自己满意的房子,但是又不敢相信网上的价格,人生地不熟的,Alex怕被宰,就从自己做数据分析的朋友Bachelor手里要到了过去几年一些有关波士顿房价的资料。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
house_prices = pd.read_csv("train.csv")
Bachelor给的数据非常非常多,包含各个方面。
为了方便分析呢,先提取其中三个特征作为分析素材,分别是LotArea表示房屋面积,TotalBsmtSF表示地下室的总面积,SalePrice表示的就是房价了。
house_prices[['LotArea', 'TotalBsmtSF', 'SalePrice']]
理工科出生的Alex想起了曾经学过的知识,想计算一下自己喜欢的那几套房子的大概房价是多少,到买房的时候心里好有点数。
于是他把数据重新处理了一下。
sample_test_data = house_prices[['LotArea', 'TotalBsmtSF', 'SalePrice']].copy()
sample_test_data.rename(columns={'LotArea':'x1', 'TotalBsmtSF':'x2', 'SalePrice':'y'}, inplace=True)
sample_test_data
作为一名优秀的理科生,看见熟悉的x和y觉得舒服多了。
接下来就是建立一个数学模型了,简单的说就是找一个符合x<sub>1</sub>、x<sub>2</sub>与y关系的式子,这个简单嘛,高中就学过的东西,待定系数法呗,只不过从一个x变成了x<sub>1</sub>、x<sub>2</sub>而已,那设两个未知数不就可以了。
设:$$y=ax_1+b_x2$$
这公式那么一写阿,瞅起来像是一个线性模型,简单理解也就是一条线嘛。
再仔细一看,这条线还必须过原点,那就麻烦了,还不能确定这个x<sub>1</sub>、x<sub>2</sub>跟y组成的函数图像一定过原点阿,必须要经过原点这个限制可就太大了。
没办法,再加一个未知数吧,把方程改成$$y=ax_1+b_x2+c$$
这样以来,在没确定a、b、c之前,函数图像可以是空间中任意的。
接下来就是把a、b、c确定下来了,只要它们三个确定下来就好办了,把自己喜欢的房子的平均房间数和到五个波士顿就业中心的平均距离直接代入x<sub>1</sub>、x<sub>2</sub>,不就能计算出来一个大概的房价y了么。
看着
$$y=ax_1+b_x2+c$$
这个式子,Alex自己都笑了,这玩意是高中才写的方程,自己孬好也是上过大学的人,于是把方程又改了改:
$$y=θ_1x_1+θ_2x_2+θ_0$$
这样,如果跟房价有关的x特征很多的话,就能把方程写成矩阵相乘的形式了:
$$y_\theta(x)=\theta_0x_0+\theta_1x_1+\theta_2x_2+...+\theta_ixi+...+\theta{n-1}x_{n-1}+\theta_nxn=\sum{i=0}^n=\theta^Tx$$
这个θ<sub>i</sub>阿,有个学名叫权重项。
这个θ<sub>0</sub>x<sub>0</sub>呢,就是之前写的θ<sub>0</sub>,让x<sub>0</sub>=1不就是咯。
也就是说,我得在我的数据里再加一行x<sub>0</sub>的数据,值全部设置为1就行了。
sample_test_data['x0'] = 1
sample_test_data = sample_test_data[['y', 'x0', 'x1', 'x2']] # 更换一下y、x1、x2、x0的顺序,方便看而已,无意义
sample_test_data
毕竟阿,这个方程是咱自己写的,假设最后算出来了一套θ<sub>i</sub>,为了拟合大部分的数据,按照θ<sub>i</sub>计算出来的房价跟真实的房价之间还是有一定的差距的。
如果说对比真实的房价数据,根据咱们这个方程计算出来的房价跟真实的房价相差无几,那不就是想要的结果么,我输入想要买的房子的x特征值,计算出来的房价y就越接近真实房价。
当然这是后话,现在咱们的目的是啥,就是让通过咱们方程计算出来的房价跟真实的房价的差值越小越好嘛。
$$y_{(i)}=\theta^Tx_i+\epsilon_i$$
对于每一套房子,y<sub>(i)</sub>表示真实的房价,通过θ<sup>T</sup>x<sub>i</sub>计算出来的是模型预测房价,ε<sub>i</sub>是预测房价跟真实房价之间的差距,当然ε<sub>i</sub>有可能是正数也有可能是负数。
目的什么来着,让差距越来越小对吧,也就是让ε<sub>i</sub>越来越小,当然这个越来越小是说差距越来越小,也就是绝对值越来越接近于0。
给方程移下项:
$$\epsiloni=y{(i)}-\theta^Tx_i$$
这时候咱们再来回顾一下阿,对于方程
$$y_{(i)}=\theta^Tx_i+\epsilon_i$$
θ<sup>T</sup>x<sub>i</sub>是表示系数,如果在坐标系表示的话是由x确定一个图像。
当只有一个x的时候,图像是一维的,也就是平面上的一条线;
当有两个x的时候,图像是二维的,也就是空间里的一个面;
当有更多x的时候,我是想象不出来了……
就拿只有两个x举例随便画一个图像:
在这个图像里,假设青蓝色的那个平面表示的就是θ<sup>T</sup>x<sub>i</sub>,真实房价y(i)在图中表示的红色的点。
这样看就清晰了,目的是让
$$\epsiloni=y{(i)}-\theta^Tx_i$$
的绝对值越小越好,表示在图像上就是红色的点越接近青蓝色的平面越好。
这里要明确一个思想,真实房价是确定了,也就是y<sub>(i)</sub>、红色的点是确定的,而青蓝色的平面θ<sup>T</sup>x<sub>i</sub>才是变动的,也就是说,在空间里,我们要移动平面来拟合点,找到哪一个平面到所有点的距离最小。
这个预测房价与真实房价之间的距离,也就是误差ε<sub>(i)</sub>是独立并同分布,并且服从均值为0方差为σ<sup>2</sup>的高斯分布。
这里突然间冒出来三个不熟悉的名词解释一下阿:
独立:各个样本点之间是相互独立的。也就是说,Alex去波士顿买房,跟Bachelor早波士顿买房,只要两个人买的不是同一套房子,它们之间是没有关系的,买到的房价多少只跟各个房东有关。
同分布:数据的来源必须相同。Alex是想在波士顿买房,所以需要的是过去几年波士顿的房价数据,如果拿得是纽约的房价数据,显然是不符合需求的,建立的数学模型也不准确。
高斯分布:也就是正态分布,一种连续型随机变量的概率密度函数。先来看一下正态分布的函数图像:
看起来是不是特别圆润,符合一种对称美,是不是觉得手感肯定特别好。
为什么要用高斯分布?
其实我们一开始并不能确定误差一定服从高斯分布,只不过阿,根据前人的经验,大多数误差经过测量被证实是服从高斯分布的,说明高斯分布对误差假设来说是一种很好的模型。
在自然界与生产中,一些现象受到许多相互独立的随机因素的影响,也就是我们买房过程中的每套住房的平均房间数、到五个波士顿就业中心的平均距离,如果每个因素所产生的影响都很微小,总的影响可以看作是服从正态分布的。
当然上面那个高斯分布图看起来不是很清晰,我们可以用numpy和matplotlib自己来画一个简单的高斯分布函数图像。
在数学上,正态分布的概率密度函数:
$$f(x)=\frac{1}{\sqrt{2π}\sigma}e^{\frac{-(x-u)^2}{2\sigma^2}}$$
当u=0,σ=1时,正态分布称为标准正态分布:
$$f(x)=\frac{1}{\sqrt{2π}}e^{\frac{-x^2}{2}}$$
def gaussian(x, mean, sigma):
return (np.exp((-(x - mean) ** 2) / (2 * sigma ** 2)) / (np.sqrt(2 * np.pi) * sigma))
mean, sigma = 0, 1
x = np.arange(-3, 3, 0.001)
plt.plot(x, gaussian(x, mean, sigma))
plt.show()
从高斯分布图可知,[-2,2]之间的分布占大部分,啥意思呢,说的其实是预测房价跟真实房价大多数情况下都是差异不大的。
在我们的房价预测问题中,均值μ=0,所以可以把公式写成:
$$f(x)=\frac{1}{\sqrt{2π}\sigma}e^{-\frac{x^2}{2\sigma^2}}$$
之前所假设的是误差ε<sub>(i)</sub>服从正态分布,所以ε<sub>(i)</sub>就是正态分布函数中的x,我们再把ε<sub>(i)</sub>代入到公式中:
$$f(ε{(i)})=\frac{1}{\sqrt{2π}\sigma}e^{-\frac{ε{(i)}^2}{2\sigma^2}}$$
我们把之前推导出的结果
$$\epsiloni=y{(i)}-\theta^Tx_i$$
也就是预测房价与真实房价之间的差距,再代入到公式中:
$$f(y_{(i)}-θ^Txi)=\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y{(i)}-θ^Tx_i)^2}{2\sigma^2}}$$
在这个公式中,y<sub>(i)</sub>表示的真实房价,是已知的,x<sub>(i)</sub>呢,是每间房子的特征,也就是房屋的平均房间数之类的,也是已知的。
也就是说,整个公式中,只有θ<sup>T</sup>是未知的。
这样的话,咱们把自变量换一下,整成一个关于未知数θ的函数:
$$L(θ)=\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}$$
我们一开始的目的是想让误差变小,在正态分布中,对于自变量x,绝对值越小,越接近于0,因变量的值越大。
好了,现在我们的目的进阶了一下,让L(θ)的值越大越好。
那么,怎么才能让L(θ)的值变大呢?
我们不是有往年的波士顿房价资料么,把以前的一些资料全部代入进去不就行了。
代入一个,得到一个L(θ1),再代入一个得到一个L(θ2),然后一直代入,一直代入……
咱们是想让建立的数学模型最好能够拟合所有的样本,也就是说,让所有的L(θ)都最大。
现在把所有的L(θ)整合起来,做一个累乘:
$$L(θ)=\prod{i=1}^{n}\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y{(i)}-θ^Tx_i)^2}{2\sigma^2}}$$
为什么要做累乘而不是累加呢?
这个其实跟数学有关,多个样本之间的累乘依然保留原本的分布模式,并且会使常见的概率更常见,这个概率对所有的样本关联性更强。
累加当然可以用,假如说L(θi)={1,2,3,4,5,6,7,8,9},把所有的数累加起来,其结果sum_L(θi)=45,但是如果把所有的结果累乘起来,其结果ride_L(θi)=362880。
这个时候,如果缺了一个数7,那么sum_L(θi)'=38,ride_L(θi)’=51840,累乘的结果降低的更多,说明累乘的结果对每一个样本的关联性更大。
对于L(θ),它有一个学名叫似然函数。
来看一下定义:似然函数也是一个概率密度函数L(θ∣x),表示在样本值x已知的情况下求最可能的θ值;实际运用中,根据我们的样本去估计参数值,找到最最符合的参数,使得与我们的数据组合后恰好是真实值。
暂时不需要去深刻的理解似然函数的概念,咱现在的主要目的是买房。
现在得到了一个累乘的结果L(θ),但是累乘算起来比较麻烦,咱们可以把累乘转换为累加,方法是对等式两边同时取对数:
$$ln^{L(θ)}=ln^{\prod{i=1}^{n}\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y{(i)}-θ^Tx_i)^2}{2\sigma^2}}}$$
虽然转换了,但是效果还是一样的,只是通过累加来计算而已。
根据对数运算的性质,可以将累乘计算提到ln前边,变成累加运算:
$$ln^{L(θ)}=\sum{i=1}^nln^{\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y{(i)}-θ^Tx_i)^2}{2\sigma^2}}}$$
再看一下右式ln运算的真数:
$$\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}$$
这也是一个乘法运算,而且前一项
$$\frac{1}{\sqrt{2π}\sigma}$$
是一个常数,后一项
$$e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}$$
根据对数运算的性质可以消去e。
化简一下,公式就变成了:
$$ln^{L(θ)}=\sum{i=1}^n(ln^{\frac{1}{\sqrt{2π}\sigma}}+ln^{e^{-\frac{(y{(i)}-θ^Tx_i)^2}{2\sigma^2}}})$$
$$=\sum{i=1}^n(ln^{\frac{1}{\sqrt{2π}\sigma}}-\frac{(y{(i)}-θ^Tx_i)^2}{2\sigma^2})$$
$$=\sum{i=1}^nln^{\frac{1}{\sqrt{2π}\sigma}}-\sum{i=1}^n\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}$$
之前我们分析过了,整个式子里只有θ<sup>
来源:51CTO
作者:wx5e46005fc4d21
链接:https://blog.51cto.com/14691718/2471010