1 线性回归的宗旨寻找曲线
回归的目的是预测数值型的目标值。最直接的办法是依据输入写出一个目标值的计算公式。
假如你想要预测的房价,可能会这么计算:y(房价),x(房价大小)
这就是所谓的回归方程(regression equation),其中的1000和200称作回归系数(regression weights),求这些回归系数的过程就是回归。一旦有了这些回归系数,再给定输入,做预测就非常容易了。
具体的做法是用回归系数乘以输入值,再将结果全部加在一起,就得到了预测值。
2 表达式
一元线性回归表达式:
多元线性回归表达式:
3 图示说明
对给定的样本点用直线(平面)进行拟合,求解最佳直线(平面)的过程,就是求解回归方程的过程。
下面是一元线性回归例子的图:
下面是多元线性回归例子的图:
注:多元线性回归在图上最多只有三维。
4 总结
根据已知样本点求解回归系数。(系数确定,回归方程也就确定)。求这些回归系数的过程就是回归。
如何判断该直线是最佳直线呢?
答:用代价函数寻找最佳直线。
5 线性回归的代价函数
就是用最小二乘法算出拟合的线性函数。
5.1 最小二乘法
5.1.1 最小二乘法的思想
最小二乘法的思想:
最小二乘法则是一种统计学习优化技术.
它的目标是最小化误差( error=𝑦−ℎ𝜃 (𝑥))平方之和,从而找到最优模型,这个模型可以拟合(fit)观察数据。
机器学习中回归学习最常用的损失函数是平方损失函数,在此情况下,回归问题可以用著名的最小二乘法来解决。最小二乘法就是曲线拟合的一种解决方法。
5.1.2 最小二乘法的分类
线性最小二乘法
非线性最小二乘法(ℎ𝜃 (𝑥)不能表示成上述形式,即不是𝑥的线性函数)
注:非线性的经常需要数值方法来求解。比如:随机梯度下降或者牛顿法等。当然,随机梯度下降也可以解决线性问题。
5.1.3 最小二乘法目标公式
最小二乘法的目标就是最小化公式(1)。 ℎ𝜃 (𝑥 ^ ((𝑖) ) ) 是预测值, 𝑦^((𝑖))是真实值。 通俗来讲,就是使得真实值和预测值(拟合值,模型给出)之间的距离平方和最小化。
5.1.4 最小二乘法的求解方法
方法一的注意点:
要求矩阵(𝑥^𝑇 𝑥)是可逆的,矩阵可逆的充要条件。
注:(矩阵可逆的充要条件)
A是可逆矩阵的充分必要条件是∣A∣≠0,即可逆矩阵就是非奇异矩阵。(当∣A∣=0时,A称为奇异矩阵)。
numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。
5.1.5 ws的推导过程
注:
5.1.6 总结
对于某些线性回归问题,采用标准方程法而不是梯度下降法(迭代)求解θ,因为标准方程法会更加快捷方便。
6 案列1
对下列数据集进行线性回归。
6.1 方法一:
6.1.1 画出散点图
'''
案列1
'''
import matplotlib.pyplot as plt
import numpy as np
np.set_printoptions(suppress=True)#显示的数字不是以科学记数法显示
dataSet=np.genfromtxt('ex0.txt')#读取数据
x_data=dataSet[:,:-1]#读取除了最后一列以外的数据
y_data=dataSet[:,-1]#只读取最后一列的数据
def plot():#定义画图函数
plt.scatter(x_data[:,1],y_data,c='blue',s=10)
#将第二列的数据当做x轴,最后一列的数据当做y轴,点的颜色为蓝色,大小为10
'''
因为sklearn里面的线性回归,会对数据自己添加偏置项,数据本身有偏置项,所以
只读取第二列
'''
plt.xlabel('X')
plt.ylabel('Y')
plot()#调用函数
plt.show()#画出图像
from sklearn.linear_model import LinearRegression#从sklearn中导入线性回归的包
LR=LinearRegression()#简写
XData=x_data[:,1,np.newaxis]#加入新的维度
'''
注1:
model.fit(x,y)#x即特征数据永远是二维的
model.predit(x)#x即特征数据永远是二维的
'''
LR.fit(XData,y_data)
print(LR.coef_)#打印回归方程的系数
print(LR.intercept_)#打印截距
print(LR.score(XData,y_data))#打印相关系数R^2
6.1.2 算ws,即系数和截距
ws=np.zeros((2,1))#将系数和截距转化为数组
ws[0]=LR.intercept_#将系数当作ws的第一个元素
ws[1]=LR.coef_#将截距当作ws的第二个元素
print(ws)
#print(x_data)
yHat=np.mat(x_data)*ws#先将x_data转化为矩阵,两矩阵相乘,才可以得到预测函数的形式
plot()#画出散点图
plt.plot(x_data[:,1],yHat,'r')#plot画出直线
plt.show()#show()把图显示出来
6.2 方法二:
自己算ws
6.2.1 导入包和数据,画出散点图
import numpy as np
import matplotlib.pyplot as plt
dataSet=np.genfromtxt('ex0.txt')
x_data=dataSet[:,:-1]
y_data=dataSet[:,-1]
def plot():
plt.scatter(x_data[:,1],y_data)#scatter函数是画点的
plot()
plt.show()
# print(x_data)
运行结果:
6.2.2 定义函数,算出ws
def standRegres(xArr,yArr):
xMat=np.mat(xArr)
yMat=np.mat(yArr).T
xTx=xMat.T*xMat
if np.linalg.det(xTx)==0.0:
print("这个矩阵使奇异矩阵,矩阵不可逆")
return#不可以省
ws=(xTx).I*(xMat.T*yMat)
return ws
ws=standRegres(x_data,y_data)
print(ws)
运行结果:
6.2.3 写出拟合直线的函数,并画在散点上
#根据回归方程,画出拟合直线
#预测值:y=kx+b的形式
yHat=x_data*ws
plt.plot(x_data[:,1],yHat,c='r')#plot(x,y),plot函数是画直线
plot()
plt.show()
运行结果:
6.2.4 总结
算ws,可以和高中的y=kx+b进行类比,方便理解。
7 线性回归和Logistic回归对比
逻辑回归处理的是分类问题,线性回归处理的是回归问题,这是两者最本质的区别。
8 局部加权线性回归
线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有最小均方误差的无偏估计。显而易见,如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。
8.1 局部加权线性回归算法的原理
为了解决以上问题,提出的一个方法是局部加权线性回归(Locally Weighted Linear Regression,LWLR)。在该算法中,我们给待预测点附近的每个点赋予一定的权重;
该算法解出回归系数w的形式如下:
其中𝑊是一个矩阵,用来给每一点赋予权值。
LWLR使用“核”(与支持向量机中的核类似)来对附近的点赋予更高的权重①。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:
8.2易错点
记得给横坐标的值进行重新排序,不然画出来的图会错乱不堪。