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

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

一:线性回归的数学假设

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)
对数极大似然和最小二乘的联系:
由线性函数的假设知道,噪音项满足高斯分布,其中一个样本的正态分布的数学表达为:

那么,通过极大估计求得似然函数为所有样本的乘积,如下:
机器学习之线性回归(Linear Regression)_第1张图片
经过数学运算和推导,求极大似然的最大值可以转化为求其log函数的最大值,推导过程如下:
机器学习之线性回归(Linear Regression)_第2张图片
要使得极大似然取得极大值,上式中的后一项就要最小,也可以将求线性回归的极大似然转化为求最小二乘的最小值,也就是常见到的线性函数的最小二乘求损失函数的数学形式:

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

对其求导并求驻点

机器学习之线性回归(Linear Regression)_第3张图片
另上式为0,可求得

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

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


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

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


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()  


你可能感兴趣的:(机器学习之线性回归(Linear Regression))