@Duanxx
2016-06-04T11:17:10.000000Z
字数 5001
阅读 5397
监督学习
@author : duanxxnj@163.com
对于一个的拥有个观测的训练数据集而言,回归的目的就是要对新的维输入,预测其对应的一个或者多个目标输出。
线性回归模型的基本特性就是:模型是参数的线性函数。
最简单的线性回归模型当然是模型是参数的线性函数的同时,也是输入变量的线性函数,或者叫做线性组合。
如果我们想要获得更为强大的线性模型,可以通过使用一些输入向量的基函数的线性组合来构建一个线性模型。这种模型,由于它是参数的线性函数,所以其数学分析相对较为简单,同时可以是输入变量的非线性函数。
从概率的角度来说,回归模型就是估计一个条件概率分布:。因为这个分布可以反映出模型对每一个预测值关于对应的的不确定性。基于这个条件概率分布对输入估计其对应的的过程,就是最小化损失函数(loss function)的期望的过程。
对于线性模型而言,一般所选择的损失函数是平方损失。
由于模型是线性的,所以在模式识别和机器学习的实际应用中存在非常大的局限性,特别是当输入向量的维度特别高的时候,其局限性就更为明显。但同时,线性模型在数学分析上相对较为简单,进而成为了很多其他的复杂算法的基础。
对于一个一般的线性模型而言,其目标就是要建立输入变量和输出变量之间的回归模型。该模型是既是参数的线性组合,同时也是输入变量的线性组合。从数学上来说,如果定义为模型期望的输出,那么
这里,我们定义为参数向量, 若取,则输入向量是维的。
在回归模型中,有一个比较特殊的回归模型: 逻辑回归(Logistic Regression),这是一个用于分类的线性回归模型。
下面给出一份简单的线性回归的代码
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
author : duanxxnj@163.com
time : 2016-06-02-09-33
这个是线性回归的示例代码
使用一条直线对一个二维数据拟合
"""
print(__doc__)
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
# 加载用于回归模型的数据集
# 这个数据集中一共有442个样本,特征向量维度为10
# 特征向量每个变量为实数,变化范围(-.2 ,.2)
# 目标输出为实数,变化范围 (25 ,346)
diabetes = datasets.load_diabetes()
# 查看数据集的基本信息
print diabetes.data.shape
print diabetes.data.dtype
print diabetes.target.shape
print diabetes.target.dtype
# 为了便于画图显示
# 仅仅使用一维数据作为训练用的X
# 这里使用np.newaxis的目的是让行向量变成列向量
# 这样diabetes_X每一项都代表一个样本
diabetes_X = diabetes.data[:, np.newaxis, 2]
# 此时diabetes_X的shape是(442L, 1L)
# 如果上面一行代码是:diabetes_X = diabetes.data[:, 2]
# 则diabetes_X的shape是(442L,),是一个行向量
print diabetes_X.shape
# 人工将输入数据划分为训练集和测试集
# 前400个样本作为训练用,后20个样本作为测试用
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
# 初始化一个线性回归模型
regr = linear_model.LinearRegression()
# 基于训练数据,对线性回归模型进行训练
regr.fit(diabetes_X_train, diabetes_y_train)
# 模型的参数
print '模型参数:', regr.coef_
print '模型截距:', regr.intercept_
# 模型在测试集上的均方差(mean square error)
print("测试集上的均方差: %.2f"
% np.mean((regr.predict(diabetes_X_test) - diabetes_y_test) ** 2))
# 模型在测试集上的得分,得分结果在0到1之间,数值越大,说明模型越好
print('模型得分: %.2f' % regr.score(diabetes_X_test, diabetes_y_test))
# 绘制模型在测试集上的效果
plt.scatter(diabetes_X_test, diabetes_y_test, color='black')
plt.plot(diabetes_X_test, regr.predict(diabetes_X_test), color='blue',
linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()
线性回归(Linear Regression)通过寻找合适的,使得观测样本集合(这里观测样本集合在很多的外文书籍中比如RPML,叫做设计矩阵(design matrix)),和目标输出之间的残差平方和最小(residual sum of squares),从数学上来说,其的目标问题或者叫做损失函数是:
对于上面的损失函数而言,显然是非负的,其去最小值的充要条件就是的倒数为0时的的取值,从矩阵的角度来写这个式子:
容易得到其关于的导数为:
即:
这里,我们将定义为X的伪逆矩阵。
这个是一个非常好的结果,它说明使用最小二乘法,从数学上是可以直接通过公式来求解出参数的。
注意:最小二乘法对的估计,是基于模型中变量之间相互独立的基本假设的,即输入向量中的任意两项和之间是相互独立的。如果输入矩阵中存在线性相关或者近似线性相关的列,那么输入矩阵就会变成或者近似变成奇异矩阵(singular matrix)。这是一种病态矩阵,矩阵中任何一个元素发生一点变动,整个矩阵的行列式的值和逆矩阵都会发生巨大变化。这将导致最小二乘法对观测数据的随机误差极为敏感,进而使得最后的线性模型产生非常大的方差,这个在数学上称为多重共线性(multicollinearity)。在实际数据中,变量之间的多重共线性是一个非常普遍的现象,其产生机理及相关解决方案在“特征选择和评估”中有介绍。
前面已经提到过,线性回归模型的基本特征就是,模型是参数向量的线性函数,上面的那个例子模型同时也是输入变量的线性函数,这极大地限制了模型的适用性。这里使用基函数(basis function)对上面的线性模型进行拓展,即:线性回归模型是一组输入变量的非线性基函数的线性组合,在数学上其形式如下:
这里就是前面提到的基函数,总共的基函数的数目为个,如果定义的话,那个上面的式子就可以简单的表示为:
在“特征选择和评估”中,实际拿到手的数据,由于各种原因,往往不能直接应用到机器学习算法中,需要对原始数据做一些预处理或者是特征提取的操作,而那些从原始输入向量中提取出来的特征, 就是这一个个的.
通过使用非线性的基函数,我们可以使得线性模型成为输入向量的非线性函数。
下面举一些基于不同基函数的线性模型的例子:
这里取,那么就可以很容易的得到:
这里就是典型的多项式曲线拟合(Polynomial Curve Fitting),其中是输入变量的最高次数,同时也是模型的复杂度。多项式曲线拟合的一个缺陷就是这个模型是一个输入变量的全局函数,这使得对输入空间的一个区间的改动会影响到其他的区间,这个问题可以通过将输入空间切分成不同的区域,对不同的区域各自在各自的区域中做曲线拟合来解决,这个方法就是经典的样条函数(spline function)。笔记中有专门的一节详细的论述了多项式曲线拟合相关的特性。
这里表示的是该基函数在输入空间中的位置,参数控制的是基函数的空间尺度,这个基函数往往会被称为高斯基函数(Gaussian basis function)。需要强调一点,这里的高斯函数并不是输入空间的概率分布,其并没有概率意义。由于每个基函数前面都有一个比例系数,所以,对参数的归一化(coefficient normalization)并不是必需的。
这个基函数叫做函数,其定义为:
在神经网络中,这两个基函数有着非常广泛的应用。其实从根本上来讲,神经网络的每一层,也是一些基函数的线性组合,神经网络之所以能处理非线性问题,其根本也是由于采用了合适的非线性基函数。