2-一元线性回归理论

一元线性回归就是根据自变量x和因变量y来拟合出一条直线(一次函数h(x)=kx+b)

机器学习中通过定义损失函数来表示真实值和预测值之间的误差。每个预测值和真实值之间都是有误差的,我们可以用最小二乘法来表示这个差距                                                                                                         真实值为y,预测值为h(x),则误差平方为(y-h(x))^2                                                                       找到合适的函数,使得误差平方和最小即可

损失函数J就等于所有样本数据的误差平方和再除以2m(m表示给定的样本数据)。使得J最小的一元函数就是我们要找的拟合直线。而J和两个量有关,一个时直线的斜率k,一个是直线的截距b。所以J(k,b)=(1/2m)∑(y-h(x))^2。显然,这是一个二元函数,它有两个变量

以下以图像来表示J与k和b的关系。左图为h(x)的函数,横坐标为x,纵坐标为h(x),图上的×表示采集的数据点,右图横坐标是b,纵坐标是k,圆形曲线表示在圆形曲线上的J值都相等(J等值线)。当拟合线为蓝线所示时,J对应的点如右图×位置所示,当蓝线斜率为正时,可以看到×更接近圆心,也就是说越靠近圆心J值越小,拟合效果越好。但是右图无法直观的表示出J值,只是根据k,b值去确定的J值,要想同时表示k,b,J,我们需要借助三维坐标

为了逼近上述的这个最优点,我们采用梯度下降法(这就类似于高等数学下册学过的梯度和方向导数),并用三维坐标来直观表示(如下第二张图)(这里θ0表示b,θ1表示k),开始时随机给一个初始k和b值,然后不断沿着点的切线方向下降(如图三),但是如果函数是非凸函数(如下图函数有凸有凹)可能会因为初始值的选取不同得到不同的结果,这时就会有很多办法来解决,如选取很多初始值等,这里就不赘述了,有兴趣可以去了解。一般都为下图第一张图所示的凸函数,这个曲面在x,y轴上的投影也就对应了上面所看的那个多个同心椭圆的函数

                    

综上,梯度下降法可以归结为一个公式(如下):  梯度下降法就是选取的初始点(k0,b0)沿它的切线方向向下移动到另一个点(k1,b1)然后再沿切线方向向下移动 。α叫做学习率是用来控制步长的,对于它的选取不能太小也不能太大,可以多尝试一些值0.1,0.03,0.003,0.0003等

注意:k和b是同步更新的,k变b也变

                                                                                            

将J(k,b)关于k和b的偏导带入上式,得到下图所示公式

  • 补充

Python-Sklearn中的线性回归模型:

normalize:如果数据值差异比较大则需要打开

通过上述的调用,就生成了一个线性回归模型Ir,然后通过Ir.方法名的形式来调用库中的方法

fit方法:函数形式fit(X,y[,sample_weight])。fit方法用来输入要拟合的数据,并且对数据进行拟合,得到最优k和b值

get_params方法:函数形式get_params([deep])。通过调用此方法来获取到fit方法给的最优参数

predict方法:函数形式:predict(X),通过输入的X值来获取到预测的Y值。

score方法:函数形式score(X,y[,sample_weight])。得到准确率

如下为示例代码

from sklearn.linear_model import LinearRegression #sklearn是python中的机器学习库,这里我们只 
                                                  #用到了回归,所以只引入LinearRegression 
import numpy as np                                
import matplotlib.pyplot as plt
data = np.genfromtxt("data.csv", delimiter=",") # 载入数据,数据存在于data.csv文件中。以“,“
                                                #为分隔符
x_data = data[:,0] 
y_data = data[:,1]            #切片操作,所有数据的第一列赋给x_data数组,第二列赋给y_data数组
plt.scatter(x_data,y_data)    #绘制散点图
plt.show()                    #展示散点图
print(x_data.shape)                
x_data = data[:,0,np.newaxis]	#给数据加一个维度,因为fit数据要输入二维数据	
y_data = data[:,1,np.newaxis]
model=LinearRegression()	#实例化一个线性回归对象	
model.fit(x_data, y_data)	#拟合模型	
plt.plot(x_data, y_data, ‘b’)#画出数据点
plt.plot(x_data, model.predict(x_data),‘r’) #画出回归线

运行上述代码就会得到下述图像

关于sklearn更丰富的内容可以去官方网站上查询:

https://scikit-learn.org/stable/modules/generated/sklearn n.linear_model.LinearRegression. html#sklearn.linear_model.LinearRegression.fit

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值