回归是对连续型数据进行处理,目的是预测数值型数据的目标值我们说的回归一般是指线性回归,也就是说输入特征和输出结果满足线性关系,回归模型正是表示输入特征和输出结果之间的映射的函数1. 线性回归的原理1.1 我们的目标是?
回归的目的是要预测出一堆数值型数据的目标值,也就是要找到一个回归方程一旦找到这个回归方程,再给定一个输入,做预测就非常容易了所以线性回归是要学得一个回归方程尽可能准确的预测输出的目标值1.2 如何找回归方程?。
我们如何从一堆数据里找到一个回归方程呢?假设我们现在手里有一些已知的样本集X和对应的标签Y,对于给定的数据X1,预测结果将会通过 Y=XTwY= X^{T}w 给出要找到回归方程,也就是确定回归系数W,那么如何确定W呢?关键在于衡量预测值和真实值之间的误差值,当然是误差越小越好啦。
那么我们就来求使得误差最小的W的值回归任务最常用的性能度量是“均方误差”,基于均方误差最小化来进行模型求解答方法称为“最小二乘法”,即试图找到一条直线,使得所有样本到直线的欧式距离最小1.2.1 目标函数是?
L(w)=argmin∑i=1m(yi−xiTw)2L(w) = argmin\sum_{i=1}^{m}{(y_{i}-x_{i}^{T}w)}^{2}1.2.2 如何求W?这里 L(w)L(w) 是关于W的凸函数,当对W的导数为零时,得到W的最优解。
∂L(w)∂w=2(w∑i=1mxi2−∑i=1myixi)\frac{\partial L(w)}{\partial w} = 2(w\sum_{i=1}^{m}{x_{i}^{2}}-\sum_{i=1}^{m}{y_{i}}{x_{i}})
用矩阵表示还可以写做:∂L(w)∂w=2XT(Xw−y)\frac{\partial L(w)}{\partial w} = 2X^{T}(Xw-y)令上式为零,得到:w=(XTX)−1XTyw=(X^{T} X)^{-1}X^{T}y
注意:以上计算用到矩阵求逆,因此这个方程只做逆矩阵存在的时候适用,在写代码的时候需要做出判断方法:判断矩阵的行列式是否为0,为0就不存在逆矩阵,不为0才存在逆矩阵小结:读入数据,将数据特征x、特征标签y存储在矩阵x、y中 验证 x^Tx 矩阵是否可逆 使用最小二乘法求得 回归系数 w 的最佳估计。
2. 线性回归的开发流程收集数据: 采用任意方法收集数据准备数据: 回归需要数值型数据,标称型数据将被转换成二值型数据分析数据: 绘出数据的可视化二维图将有助于对数据做出理解和分析,在采用缩减法求得新回归系数之后,可以将新拟合线绘在图上作为对比
训练算法: 找到回归系数测试算法: 使用 R^2 或者预测值和数据的拟合度,来分析模型的效果使用算法: 使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签
2.1 项目案例根据下图中的点,找出该数据的最佳拟合直线完整代码链接:lctagnes/AI_Learning123github.com/lctagnes/AI_Learning123/tree/master/src/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%AE%9E%E6%88%98/%E5%9B%9E%E5%BD%92%E7%AE%97%E6%B3%95%E5%AE%9E%E7%8E%B0
代码编写:fromnumpyimport*importmatplotlib.pyplotaspltdefloadDataSet(fileName):# 获取样本特征总数numFeat=len(open(
fileName).readline().split(\t))-1dataMat=[]labelMat=[]fr=open(fileName)# 遍历每一行forlineinfr.readlines():
lineArr=[]# 删除一行中以tab分割的前后空白符号curLine=line.strip().split(\t)# 遍历每一个特征,index:0,1foriinrange(numFeat):# 每行的每个特征放到lineArr
lineArr.append(float(curLine[i]))# 所有行的特征放到dataMatdataMat.append(lineArr)# 把目标变量放到labelMatlabelMat.append
(float(curLine[-1]))returndataMat,labelMatdefstandRegres(xArr,yArr):# mat()函数将列表转换为矩阵,mat().T表示对矩阵转置xMat
=mat(xArr)yMat=mat(yArr).TxTx=xMat.T*xMat# linalg.det(xTx)用来计算矩阵的行列式,如果为0,不可逆,不为0才可逆iflinalg.det(xTx)
==0.0:print("This matrix is singular, cannot do inverse")return# 最小二乘法求得w的最优解ws=xTx.I*(xMat.T*yMat)return
wsws=standRegres(dataMat,labelMat)xMat=mat(dataMat)yMat=mat(labelMat)x=xMat[:,1].flatten().A[0]y=yMat
.T[:,0].flatten().A[0]plt.figure(figsize=(8,5))plt.scatter(x,y,c=green)plt.xlabel("X")plt.ylabel("Y")
xCopy=xMat.copy()xCopy.sort(0)yHat=xCopy*wsplt.plot(xCopy[:,1],yHat,c=red)plt.show()拟合效果:
3. 线性回归案例气温会随着海拔高度的升高而降低, 我们可以通过测量不同海拔高度的气温来预测海拔高度和气温的关系. 我们假设海拔高度和气温的关系可以使用如下公式表达:y(气温) = a * x(海拔高度) + b
理论上来讲, 确定以上公式 a 和 b的值只需在两个不同高度测试, 就可以算出来 a 和 b 的值了. 但是由于所有的设备都是有误差的, 而使用更多的高度测试的值可以使得预测的值更加准确. 我们提供了在9个不同高度测量的气温值, 请你根据今天学习的线性回归方法预测 a 和 b 的值. 根据这个公式, 我们预测一下在8000米的海拔, 气温会是多少?
数据文件请见exercise/height.vs.temperature.csvimportpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltfrom
sklearn.linear_modelimportLinearRegression#读取数据data=pd.read_csv("data/height.vs.temperature.csv")data
.head()#数据可视化plt.figure(figsize=(16,8))plt.scatter(data["height"],data["temperature"],c=g)plt.xlabel(
"Height")plt.ylabel("Temperature")plt.show()#训练线性回归模型X=data["height"].values.reshape(-1,1)y=data["temperature"
].values.reshape(-1,1)reg=LinearRegression()reg.fit(X,y)#模型可视化predictions=reg.predict(X)plt.figure(figsize
=(16,8))plt.scatter(data["height"],data["temperature"],c=g)plt.plot(data["height"],predictions,c=red,
linewidth=2)plt.xlabel("height")plt.ylabel("temperature")plt.show()#做预测:假设山的高度为8000米,那么预测温度是多少?predictions
=reg.predict([[8000]])print(山的高度为8000米, 预测温度是{:.5}度.format(predictions[0][0]))4.本文代码参考《机器学习实战》,侵删