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

一:线性回归的数学假设

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

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

二、线性回归建模

2.1方程式表示:

数学形式:

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

2.2 损失函数(Loss function)
对数极大似然和最小二乘的联系:
由线性函数的假设知道,噪音项满足高斯分布,其中一个样本的正态分布的数学表达为:
机器学习之线性回归(Linear Regression)
那么,通过极大估计求得似然函数为所有样本的乘积,如下:
机器学习之线性回归(Linear Regression)
经过数学运算和推导,求极大似然的最大值可以转化为求其log函数的最大值,推导过程如下:
机器学习之线性回归(Linear Regression)
要使得极大似然取得极大值,上式中的后一项就要最小,也可以将求线性回归的极大似然转化为求最小二乘的最小值,也就是常见到的线性函数的最小二乘求损失函数的数学形式:
机器学习之线性回归(Linear Regression)
由此就得到了线性函数的loss function
三、线性函数算法:求解参数θ
机器算法的目的就是通过建立模型并通过选择合适的算法来求出参数机器学习之线性回归(Linear Regression)下的y和实际的Y之间的差值尽量的小,也就是预测的准确率在训练集和测试集足够高
3.1 当矩阵θ可逆(满秩)时,通过normal equation可以直接求解θ
目标函数转化为矩阵形式:
机器学习之线性回归(Linear Regression)
对其求导并求驻点

机器学习之线性回归(Linear Regression)
另上式为0,可求得
机器学习之线性回归(Linear Regression)
此算法的缺点是:当矩阵很大是,计算非常耗时且占用资源
3.2 当矩阵θ不可逆(非满秩)时,通过梯度下降求解θ
初始化θ,沿着负梯度方向进行迭代,知道机器学习之线性回归(Linear Regression)变化很小或者不变化
机器学习之线性回归(Linear Regression)
梯度下降中设计到的参数是,步长alpha,迭代次数t,这些对于计算最终的机器学习之线性回归(Linear Regression)都会影响,所以需要调参优化。
常用的梯度下降算法有SGD,BGD,mBGD,实际中以mBGD使用最多
四、线性回归防止overfitting
机器学习最忌讳的是死记硬背,像考试一样平时学习只记得死答案了,在考试的时候就不会做题目了,为了灵活变通,overfitting的方法就出现了,线性回归中最常用的是引入正则化项,也就惩罚项,给损失函数的参数θ赋予一个约束项,使其不能任意的无限大或者无限小,加入正则化损失函数变为:
机器学习之线性回归(Linear Regression)

4.1当矩阵满秩时,引入正则项后的θ变为:
机器学习之线性回归(Linear Regression)
4.2当矩阵不满秩时,引入正则项后的θ变为:
机器学习之线性回归(Linear Regression)
五、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年气温和气压的曲线图,可以看到有比较明显的线性趋势的关系,说明我们可以用线性回归来进行预测,接下来我们就进行预测
机器学习之线性回归(Linear Regression)
预测后的test和predict的图如下:

机器学习之线性回归(Linear Regression)
上图分别用了线性回归的解析解以及基于Ridge 惩罚的线性回归,从拟合结果看,两种方法效果差不多,最后,将预测准确率输出:
机器学习之线性回归(Linear Regression)
两种方法的准确率大概都在~87%,Ridge回归的效果稍好但不明显。

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


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

相关文章:

  • 2021-07-07
  • 2021-12-13
  • 2022-01-05
  • 2021-08-26
  • 2021-09-24
  • 2021-12-13
  • 2021-12-30
  • 2021-09-26
猜你喜欢
  • 2021-06-07
  • 2021-12-13
  • 2021-10-14
  • 2021-09-10
  • 2021-06-02
相关资源
相似解决方案