码迷,mamicode.com
首页 > 其他好文 > 详细

线性回归相关知识点总结

时间:2018-04-17 23:45:55      阅读:352      评论:0      收藏:0      [点我收藏+]

标签:numpy   idt   迭代   无限   pre   过程   space   可以转化   灵活   

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

一:线性回归的数学假设

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 当矩阵技术分享图片可逆(满秩)时,通过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回归的效果稍好但不明显。
原文地址:https://blog.csdn.net/july_sun/article/details/53223962

线性回归相关知识点总结

标签:numpy   idt   迭代   无限   pre   过程   space   可以转化   灵活   

原文地址:https://www.cnblogs.com/yiduobaozhiblog1/p/8870753.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!