一元线性回归就是根据自变量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