线性模型学习笔记
最近在学习线性模型,想把原理、历史都罗列清楚,但是作为初学者还有很多纰漏和没罗列完整,欢迎指正。
参考:
《机器学习》–周志华
《正态分布的前世今生》–靳志辉
http://blog.csdn.net/zouxy09/article/details/24971995/
http://blog.csdn.net/google19890102/article/details/27228279
https://en.wikipedia.org/wiki/Condition_number
http://www.cnblogs.com/zhangchaoyang/articles/2802806.html
http://blog.csdn.net/u010625210/article/details/45566727
线性模型
学习一个通过属性的线性组合进行预测的函数。这个线性组合中的参数就是我们要学习的属性,也就是下面公式中的
w
。
优势
- 可解释性
w 直观表达了各属性在预测中的重要性
劣势
对数据分布假定较多,满足假定的数据才能采用线性模型
线性回归
学习一个线性模型以预测实值,输出标记。假设样本量为n,特征量为p,一般分为三种情况:
n< p,方程的数量少于自变量的数量,有无穷多个解
n=p,可以直接用矩阵运算得到一个唯一的解析解,前提是矩阵是满秩的,如果不满秩相当于n< p的情况
n>p,常用最小二乘法进行参数求解。
最小二乘法历史
用均方误差作为损失函数,称为最小二乘法。在线性回归中,二维空间的最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。
勒让德(1752年9月18日- 1833年1月10日)
他在解决线性矛盾方程组过程中提出了最小二乘法。线性矛盾方程组指的是方程数量多于参数的数量,无法直接求解。假设有n个方程,m个变量(n>m),前人在解决这个问题的方法是把n个方程分为m组,在每组内进行线性求和从而合并得到一个方程,最终得到m个方程,再解这个方程组。这样的方法没办法为这类问题提供一个普遍可用的解决思路,只能具体问题具体解决。
勒让德在1805年发表了解决求解线性方程组的通用方法–最小二乘法。他的基本思想是,认为测量中有误差,所以所有方程的累积误差为:
对于机器学习来说,我们就是想训练误差最小:
用差的平方和做损失函数的理论依据
他对于最小二乘法的优良性质解释如下:
最小二乘法使得误差平方和最小,并在各个方程的方程之间建立平衡,从而防止某一个极端误差取得支配低位。
计算过程简单,只需求偏导后求解线性方程组。
高斯(1777年4月30日-1855年2月23日)
设真值为
θ,1,x2,...,xn
为n次独立测量值,每次测量的误差为
ei=xi−θ
,假设误差
ei
的密度函数为f(e),则测量值的联合概率为n个误差的联合概率,记为
使测量结果的联合概率,也就是 L(θ) 最大的 θ 作为估计值.
高斯首次给出极大似然的思想,这个思想后来被统计学家费希尔发展成为参数估计中的极大似然估计理论。另一方面,因为算术平均值作为估计测量值被大家认可,因此高斯猜测:
于是他寻找误差密度函数f使得极大似然估计正好是算术平均。高斯证明,在所有的概率密度函数中,唯一满足这个性质的就是
高斯由此推导出了正太分布的密度函数,他基于这个误差分布的密度函数对最小二乘法做出解释:
要使得似然值最大,那误差平方和就要取最小值,这正好就是最小二乘法的要求。
求解过程
用矩阵表示求解过程,输入数据用矩阵X表示,行表示样本,列表示特征,有m行d列。
xTi 表示第i个行向量,即第i个样本的特征向量; xj 表示第j个列向量,即第j个特征的样本向量。
输出向量y =(y1,y2,...,ym) ,参数向量 w=(w1,w2,...,wd)
令 L(w) 最小,则对 L(w) 的每个参数求偏导并为0,从而求得参数 w∗^ 。其中对第i个参数 wi 求导如下:
对
w
求导如下:
特征矩阵线性相关的问题
假设
X=(x1,x2,...,xd),XT=(xT1,xT2,...,xTd),xi
表示第i个特征的样本向量。
如果选择的特征存在线性相关,即
x2=kx1
,则矩阵
X
不满秩而且它的协方差矩阵是
XTX
也是不满秩,推导如下:
因此如果矩阵 XTX 不满秩,就不可逆,不能直接通过矩阵运算得到唯一的参数解,我们的数据不足以确定一个解。这种情况一般被认为特征空间中有冗余的特征,可以利用正则化进行特征选择。
另一方面是即使 XTX 满秩也有可能存在某些列向量高度相关,这种情况下的解析解是不可靠的。这里要简单介绍一下condition-number,这是个用来度量函数f(x)=y的解对于x的微小变化带来的y的变化程度,是x的变化跟y的变化的变化率。condition-number可以用来判断系数矩阵的多重共线性,也就是有些列向量高度相关,但是还不是线性相关(线性相关的情况在前面已经可以讨论过了),就会导致参数的求解对输入变化很敏感。
如果condition-number等于1,则这个函数以不高于输入数据的误差率逼近真实解,也就是除了测量误差,不会引进额外的误差;如果远大于1,说明x有微小误差,y也会变化很大,则这个线性方程组是ill-conditioned。x通常是测量数据误差难以避免,如果无可避免的测量误差会导致函数结果变化太大,那就很难相信函数的输出结果。
而线性方程相当于函数的逆运算,也可以用condition-number度量求解的参数的可靠性。假设一个线性方程组
Ax=b,A是非奇异矩阵,e、b不为0,b产生的误差为e,则x的误差为A−1e
,condition-number是x中的相对误差比上b中的相对误差的最大值。
采取不同的范数,具体k(A)不一样。如果A属于L2范式空间(向量空间中度量向量的大小用的是l2范数)condition-number如下:
σmaxA是A的最大奇异值,σminA是A的最小奇异值 ,奇异值是特征值的平方根。
什么情况会导致condition-number太大呢?
如果样本量太少,输入矩阵X的某些列向量很可能看起来高度相关,或者 XTX 的列向量高度相关,因为我们最终是求解 XTXwT=XTy 这个方程组。下面做个实验看看同样特征数量情况下,样本量对 k(XTX )的影响,假设采用L2范数。
import numpy as np
X=np.random.rand(20,20)
XT=np.transpose(X)
cov=np.dot(XT,X)
cov_eigval,cov_eigvec=np.linalg.eig(cov)
con=cov_eigval[0]*1.0/cov_eigval[len(cov_eigval)-1]
X2=np.random.rand(50,20)
XT2=np.transpose(X2)
cov2=np.dot(XT2,X2)
cov_eigval2,cov_eigvec2=np.linalg.eig(cov2)
con2=cov_eigval2[0]*1.0/cov_eigval[len(cov_eigval3)-1]
X3=np.rand(200,20)
XT3=np.transpose(X3)
cov=np.dot(XT3,X3)
cov_eigval3,cov_eigvec3=np.linalg.eig(cov3)
con3=cov_eigval3[0]*1.0/cov_eigval[len(cov_eigval3)-1]
经过多次测试,相同样本量的情况下,第一组实验的conditioned-number在 104到102之间 ,第二组实验的conditioned-number在10到100之间,第三组实验的conditioned-number在[60,75]之间。
由此可见特征数量不变的情况下,样本数量增大,随机生成的协方差矩阵的condition-number减少而且趋向稳定。
当解决线性方程组时,系数矩阵列不满秩或者有列向量高度相关,都不能直接通过矩阵运算求解,而是通过在损失函数中增加正则项再求解。
正则化
广义线性模型
g(x)将线性回归模型的预测值与真实标记联系起来,称为联系函数(需要单调可微),可以做输入空间到输出空间的非线性函数映射。
- 对数线性回归
当g(X)=lnX的时候,该线性模型也就是对数线性回归,线性模型的预测结果去逼近真实标记的对数
- 对数几率回归(逻辑回归)
被称为logistic函数,当x为某个样本,f(x)表示x为正例的相对可能性。 推导的过程如下:
如果将y视为样本x作为正例的可能性,则1-y是反例的可能性,两者的比值称为“几率”,反映x作为正例的相对可能性
用线性回归模型的预测结果去逼近真实标记的对数几率。
逻辑回归
LR为何是sigmoid,理论推导出sigmoid
LR参数怎么求解,有没有最优解