机器学习之线性回归(Linear Regression)

2018-02-27 11:48:51来源:http://blog.csdn.net/July_sun/article/details/53223962作者:July_sun人点击

分享

线性学习中最基础的回归之一,本文从线性回归的数学假设,公式推导,模型算法以及实际代码运行几方面对这一回归进行全面的剖析~


一:线性回归的数学假设


1.假设输入的X和Y是线性关系,预测的y与X通过线性方程建立机器学习模型


2.输入的Y和X之间满足方程Y=X+e,e是误差项,噪音项,假设e是独立同分布的,服从IID(independent and identity distribution)和均值为0,方差为某一定数的正态分布(也叫高斯分布)e服从正态分布是由中新计值定理决定的


二、线性回归建模


2.1方程式表示:


数学形式:



矩阵形式:
其中,X矩阵是m行(n+1)列的,每一行是一个样本,每一列是样本的某一个特征
矩阵(n+1)行一列的,它是X的权重,也是线性回归要学习的参数

2.2 损失函数(Loss function)
对数极大似然和最小二乘的联系:
由线性函数的假设知道,噪音项满足高斯分布,其中一个样本的正态分布的数学表达为:


那么,通过极大估计求得似然函数为所有样本的乘积,如下:


经过数学运算和推导,求极大似然的最大值可以转化为求其log函数的最大值,推导过程如下:

要使得极大似然取得极大值,上式中的后一项就要最小,也可以将求线性回归的极大似然转化为求最小二乘的最小值,也就是常见到的线性函数的最小二乘求损失函数的数学形式:



由此就得到了线性函数的loss function
三、线性函数算法:求解参数
机器算法的目的就是通过建立模型并通过选择合适的算法来求出参数下的y和实际的Y之间的差值尽量的小,也就是预测的准确率在训练集和测试集足够高
3.1%20当矩阵可逆(满秩)时,通过normal equation可以直接求解
目标函数转化为矩阵形式:

对其求导并求驻点
另上式为0,可求得


此算法的缺点是:当矩阵很大是,计算非常耗时且占用资源
3.2 当矩阵不可逆(非满秩)时,通过梯度下降求解
初始化,沿着负梯度方向进行迭代,知道变化很小或者不变化

梯度下降中设计到的参数是,步长alpha,迭代次数t,这些对于计算最终的都会影响,所以需要调参优化。
常用的梯度下降算法有SGD,BGD,mBGD,实际中以mBGD使用最多
四、线性回归防止overfitting
机器学习最忌讳的是死记硬背,像考试一样平时学习只记得死答案了,在考试的时候就不会做题目了,为了灵活变通,overfitting的方法就出现了,线性回归中最常用的是引入正则化项,也就惩罚项,给损失函数的参数赋予一个约束项,使其不能任意的无限大或者无限小,加入正则化损失函数变为:

4.1当矩阵满秩时,引入正则项后的变为:

4.2当矩阵不满秩时,引入正则项后的变为:

五、python代码实现
数据:仍然使用上海2015的气温数据
分别作图看2015上海的气温和气压的关系以及使用线性回归拟合的结果,代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import RidgeCV
from sklearn.cross_validation import train_test_split
'''#load data
n=100
x = np.arange(1,100,n)+np.random.randn(n)
y = 4*x - 3 + np.random.randn(n)
plt . figure ()
plt . plot(x, y, 'r*', label='X')
plt . ylabel (" Y" )
plt . xlabel (" X")
plt . legend(loc="best")
plt . tight_layout()
plt . show()
'''
data = ['C://Users//123//Desktop//weather//2015.txt',]
w = np. loadtxt ( data [0] , skiprows =1)
y = w[:,7]/10
x = w[:,10]
plt . figure ()
plt . plot(x,y,"b*",label="Atmospheric pressure")
plt . ylabel (" Temperatures" )
plt . xlabel ("Atmospheric pressure " )
plt . title (' Temperatures trent chart of Shanghai in year 2015 ')
plt . tight_layout()
plt . legend(loc="best")
plt . show()x = x.reshape(-1, 1)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1)
lr = LinearRegression()
lr . fit ( x_train , y_train)
y_lr = lr.predict ( x_test )
cv = RidgeCV(alphas=np.logspace(-3, 2, 100))
cv . fit ( x_train , y_train)
y_cv = cv.predict ( x_test )
print lr.coef_
print lr.intercept_
print "mes of Linear Regresion squares is", np. mean(( y_lr - y_test ) ** 2)
print "accuracy of Linear regression is",lr.score(x_test,y_test)
print cv.coef_
print cv.intercept_
print "mes of Linear Regresion+Ridge squares is", np. mean(( y_cv - y_test ) ** 2)
print "accuracy of Linear regression is",cv.score(x_test,y_test)
x1 = np.arange(len(x_test))
plt.plot(x1,y_test,"y*-",label="Test")
plt.plot(x1,y_lr,"ro-",label="Predict")
plt.plot(x1,y_cv,"b^-",label="Predict+Ridge")
plt . ylabel (" Temperatures" )
plt . xlabel (" Atmospheric pressure")
plt . title (' Predict chart ')
plt . legend(loc="best")
plt . tight_layout()
plt . show()

运行代码作图如下:
图一是2015年气温和气压的曲线图,可以看到有比较明显的线性趋势的关系,说明我们可以用线性回归来进行预测,接下来我们就进行预测

预测后的test和predict的图如下:
上图分别用了线性回归的解析解以及基于Ridge 惩罚的线性回归,从拟合结果看,两种方法效果差不多,最后,将预测准确率输出:

两种方法的准确率大概都在~87%,Ridge回归的效果稍好但不明显。总结:以上从线性回归的假设背景,数学推导,以及机器学习的建模,算法,优化和实际代码运行几方面对机器学习的线性回归做了比较全面的了解和梳理。每一种机器学习算法都有其适用的应用情况,只要熟悉这个模型的这些知识就可以游刃有余的完成自己的实际任务啦~~

参考资料:Ng斯坦福CS229视频和相关资料

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台