线性模型既有回归的,也有分类的;线性回归模型有一元线性回归和多元线性回归,还有拓展的广义线性模型。这里仅对基本的回归模型做一总结。
1. 一元线性回归
这是一种最简单的回归形式,也就是只有一个变量,表现在二维平面坐标系中就是一堆离散的点,我们要做的就是找到一条最好的直线对这些点进行拟合(如图所示),这些已知的离散点就是训练数据集。这样,对于一个新来的未知数据,我们只知道它的横坐标,就能根据模型预测出它的纵坐标。
要找出这条最优的直线,需要一个准则,也就是怎么样才算最优?因为这条直线是对训练数据点的拟合,我们可以使用均方误差作为性能度量,也就是找到那条与训练数据均方误差最小的直线。基于均方误差最小化来进行模型求解的方法称为“最小二乘法”。
在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。表现在图像上,就是训练样本点与线性回归模型的纵向距离。要确定这条直线,其实就是确定w和b两个参数。给定训练数据集为
,用残差平方和
来衡量误差,也就是使误差最小,即
(1.1)
将代入
,即得损失函数为
(1.2)
也就是求使式(1,2)值最小时的w和b. 又L是关于w和b的凸函数,求出导数为0点即可,即
(1.3)
解得
(1.4)
其中,为X的均值。
2. 多元线性回归
一元是最简单的情形,更常见的是多元情形,即每条数据有多个属性(特征),描述为:假设X和Y分别为输入和输出变量,并且Y是连续变量,给定训练数据集为, 其中
为输入实例(特征向量),n为特征个数,i=1,2,…,N,N为样本容量。也就是在n维空间中找到一个最好的超平面对训练数据进行拟合,一般形式为
(2.1)
类似的,可利用最小二乘法来对w和b进行估计。为便于讨论,把w和b吸入向量形式(列),相应的,把数据集D表示为一个
大小的矩阵X,其中每行对应于一个样本示例,前n个元素对应于示例的n个属性值,最后一个元素恒置为1,即
再把输出也写成向量形式(列),则类似于式(1.1),要求的
为
(2.2)
损失函数为,对
求导并令其为0,有
(2.3)
上式求解涉及矩阵逆运算,当为满秩矩阵或正定矩阵时可得
(2.4)
令,则最终学得的多元线性回归模型可表示为
(2.5)
然而现实任务中往往不是满秩矩阵,例如在许多任务中我们会遇到大量的变量,其数目甚至超过样例数,导致X的列数多于行数,
显然不满秩。对于这种情况我们可以使用梯度下降法进行求解,也就是先给定w和b一个初值,再根据损失函数一步一步进行迭代,对w和b进行优化。
3. 其他情形
3.1 广义线性模型
有时我们可以直观的看出数据点的走向并非是线性的,比如二维空间中一些离散点整体上呈现出指数变化趋势。这种情况下显然再用直线拟合是不合适的,我们可以对得到的回归值加上一个非线性映射,将线性回归模型的预测值与真实标记更贴切的联系起来。
如对于呈指数变化的数据集,可将模型调整为
(3.1)
即
(3.2)
这就是“对数线性回归”,它实际上是在试图让逼近
.
更一般地,考虑单调可微函数作为非线性映射,即
(3.3)
这样得到的模型称为“广义线性模型”,其中函数称为“联系函数”。显然,对数线性回归是广义线性模型在
时的特例。
3.2 多项式回归
多项式回归原理和线性回归类似,只是用的是高次多项式对数据进行拟合,可以对非线性数据拟合得更灵活,二维平面表现为一条曲线。一元多项式一般形式为
(3.4)
多项式回归从形式上不是线性的,但它可以转化为线性回归方程进行拟合:
(I) 对于一元m次多项式,令
,则该多项式可转化为m元线性回归方程
(3.5)
(II) 对于二元二次多项式,令
,则该多项式可转化为线性回归方程
(3.6)
3.3 性能评估—
称为决定系数,反映因变量的全部变异能通过回归关系被自变量解释的比例。假设
为真实标记值,
为真实标记的均值,
为预测值,令
,
,
,易知满足
,则
定义为:
(3.7)
可以用来评估预测效果,表示模型对数据的拟合程度。如R平方为0.8,则表示回归关系可以解释因变量80%的变异。换句话说,如果我们能控制自变量不变,则因变量的变异程度会减少80%.
4. python示例
(1) 一元线性回归:披萨价格预测
给定披萨尺寸和价格数据如下,建立线性回归模型并预测直径为12英寸的披萨价格。
尺寸 | 6 | 8 | 10 | 14 | 18 |
价格 | 7 | 9 | 13 | 17.5 | 18 |
由sklearn库实现,代码如下:
#-*-coding:utf-8-*-
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
import numpy as np
#定义绘图格式
def runplt():
plt.figure()
plt.title('Pizza price predict')
plt.xlabel('Diameter (inches)')
plt.ylabel('Price (US$)')
plt.axis([0, 25, 0, 25])
plt.grid(True)
return plt
plt = runplt()
#训练数据
X = [[6], [8], [10], [14], [18]]
Y = [[7], [9], [13], [17.5], [18]]
plt.plot(X, Y, 'r.')
#创建一个线性回归模型
model = LinearRegression()
#将训练数据给模型训练
model.fit(X, Y)
#测试披萨的尺寸大小
test_x = 12
#调用已训练的模型进行预测
pre = model.predict(test_x)
plt.plot(test_x, pre, 'g^')
print('均方差(残差平方和均值): %.2f' % np.mean((model.predict(X) - Y) ** 2))
print("预测12英寸的披萨价格为:",pre[0][0])
#由两点画出回归直线
test = [[0], [25]]
pre = model.predict(test)
plt.plot(test, pre, 'b-')
plt.show()
运行结果:
(2) 二元线性回归
假设除了尺寸大小,披萨价格还与辅料种类有关(如下表所示),建立二元线性回归模型,并对(8,2),(9,0),(11,2),(16,2),(12,0)等数据点进行预测。
尺寸 | 6 | 8 | 10 | 14 | 18 |
辅料种类 | 2 | 1 | 0 | 2 | 0 |
价格 | 7 | 9 | 13 | 17.5 | 18 |
由sklearn库实现,代码如下:
from sklearn.linear_model import LinearRegression
X = [[6, 2], [8, 1], [10, 0], [14, 2], [18, 0]]
y = [[7], [9], [13], [17.5], [18]]
model = LinearRegression()
model.fit(X, y)
X_test = [[8, 2], [9, 0], [11, 2], [16, 2], [12, 0]]
y_test = [[11], [8.5], [15], [18], [11]]
predictions = model.predict(X_test)
for i, prediction in enumerate(predictions):
print('Predicted: %s, Target: %s' % (prediction, y_test[i]))
print('R-squared: %.2f' % model.score(X_test, y_test))
运行结果:
参考
- 周志华.《机器学习》.清华大学出版社.
- 廖星宇.《深度学习入门之PyTorch》.电子工业出版社.
- CSDN. https://blog.csdn.net/guoyunfei20/article/details/78552892
- CSDN. https://blog.csdn.net/SA14023053/article/details/51703204
- CSDN. https://blog.csdn.net/RicardoSuzaku/article/details/78776296
- CSDN. https://blog.csdn.net/loveliuzz/article/details/78043168