1.线性回归分析( Linear Regression Analysis)
线性回归分析(Regression Analysis):其数据集是给定一个函数和他的一些坐标点,然后通过回归分析的算法,来估计原函数的模型,求得最符合这些数据集的函数解析式。然后我们就可以用来预估未知数据,输入一个自变量便会根据这个模型解析式输出因变量,这些自变量就是特征向量,因变量即为标签,而且标签的值是建立在连续范围内的。
通俗来讲就是我们在做数学题的时候,解未知数的方法。假如给定自变量和函数,通过函数处理自变量,然后获得函数的解。而回归分析便是相当于给定自变量和函数的解,然后去求函数。如下图所示,我们已经知道红色点坐标,然后回归得到直线,回归分析属于监督学习。
上图只是简单的一元线性分析,回归后我们可以得到如
的函数表达式,但更多情况下我们是求解多元线性回归问题,那应该如何解决呢。
2.模型表达
建立数学模型之前,我们先定义如下变量。
-
表示输入数据(Feature)
-
表示输出数据(Target)
-
表示一组训练数据(Training example)
- m表示训练数据的个数
- n表示特征数量
监督学习目标便是根据给定的训练数据,可以得到函数方法,使得假设函数
(hypothesis)满足
。针对线性回归而言,函数
表达式为
为方便我们使用矩阵来表达, ,其中 为 的转置。为求解函数 ,我们希望找出一组 ,使得 无限趋近0,此处我们引入梯度下降算法求解问题。
3.梯度下降算法
3.1梯度下降算法简述
实际生活中我们有时也利用梯度下降算法,比如我们处在一座山的某处位置,但我们并不知道如何下山,于是决定走一步算一步,但每次都沿着最陡峭的地点下山,也就是沿着梯度的负方向前进。但有事也会遇见问题,不能每次都能到达山脚,可能到达山峰的某个局部最低点。
从上面解释可以看出,梯度下降不一定能够找到全局最优解,有可能是局部最优解,但此种方法已能帮助我们求解线性回归问题。另外如果求解的函数是凸函数,梯度下降法得到得解一定是全局最优解。
3.2 梯度下降算法相关概念
求解梯度下降算法之前,我们先了解相关概念。
- 步长(Learning Rate):步长决定梯度下降算法过程中,每步沿梯度负方向前进的长度。
- 特征(Feature):即上述描述的
- 假设函数(Hypothesis Function):监督学习中,为了拟合输入样本,而使用假设函数
- 损失函数(Loss Function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小,意味着拟合的程度越好,对应的模型参数即为最优参数。线性回归损失函数为
我们利用梯度下降算法,目标便是找到一组 使得 达到最小。
3.3梯度下降算法过程
- 随机选取一组 。
- 不断变化
,让
变小。
, 是n+1个值同时变化。 表示学习速率,目标求最小值,因此沿负梯度方向下降,故 前为负号。 是对 的偏导。 - 直到
得到最小值。
是对 的偏导求解过程如下:
因此梯度下降算法的最终表述为
Repeat Until Convergence{
for every
}
梯度下降算法需多次迭代、算法复杂度为 。当利用梯度下降算法求得一组 时我们便能得到线性回归函数。
4.线性回归算法实现
为研究公司盈利提升幅度受电视、广播、报纸的投入的影响程度,利用多元线性回归来分析数据。其中数据下载地址为http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv ,为能够绘制出三维图片,此处只选择电视、广播的广告投入对公司盈利提升幅度的影响。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
from mpl_toolkits.mplot3d import axes3d
import seaborn as sns
#read_csv
readdata=pd.read_csv('data/Advertising.csv')
data=np.array(readdata.values)
#训练数据
X_train=data[0:150,1:3]
Y_train=data[0:150,3]
#测试数据
X_test=data[150:200,1:3]
Y_test=data[150:200,3]
#回归分析
regr = linear_model.LinearRegression()
#进行training set和test set的fit,即是训练的过程
regr.fit(X_train, Y_train)
# 打印出相关系数和截距等信息
print('Coefficients: \n', regr.coef_)
print('Intercept: ', regr.intercept_)
# The mean square error
print("Residual sum of squares: %.2f"
% np.mean((regr.predict(X_test) - Y_test) ** 2))
# Explained variance score: 1 is perfect prediction
print('Variance score: %.2f' % regr.score(X_test, Y_test))
#得出回归函数 并自定义数据
X_line=np.linspace(0,300)
Y_line=np.linspace(0,50)
Z_line=0.04699836*X_line+0.17913965*Y_line+3.00431061176
#画图
fig=plt.figure()
ax = plt.subplot(111, projection='3d') # 创建一个三维的绘图工程
ax.scatter(data[:,1],data[:,2],data[:,3],c='red',) # 绘制数据点
ax.plot(X_line,Y_line,Z_line,c='blue')#绘制回归曲线
plt.show()
其中红色为数据点,蓝色线便为我们回归之后的曲线,这里我们是利用sklearn进行线性回归分析,后续会写出sklearn教程。如有错误之处还请指正,谢谢。
5.推广
更多内容请关注公众号’谓之小一’,若有疑问可在公众号后台提问,随时回答,欢迎关注,内容转载请注明出处。