我们可以使用最小二乘法求解线性回归:
β即是我们模型训练获得的系数。但是这里有个问题即是涉及到了矩阵求逆,这就要求XTX可逆,在实际的应用中,很多情况下,矩阵是不可逆的,如何处理呢?我们可以求矩阵的伪逆,函数原型:numpy.linalg.pinv(a,rcond=1e-15)
计算一个矩阵的伪逆(Moore-Penrose)。
- a:(m,n)要求逆的矩阵
- rcond:删除在最小二乘解中“很小的”奇异值。奇异值小于
rcond*largest_singular_value
将被置为0
如果SVD计算不收敛,该函数将会抛出LinAlgError异常
矩阵A的伪逆,记为:A+,被定义为:最小二乘问题Ax=b中的“算子”。比如,如果x为最小二乘问题中的解,那么A+应满足:x=A+b
如果:是A的奇异值分解,其中Q1,2是正交矩阵,是由A的奇异值组成的对角阵,而是A的奇异值的倒数组成的对角阵(用0填充)。
G. Strang, Linear Algebra and Its Applications, 2nd Ed., Orlando, FL, Academic Press, Inc., 1980, pp. 139-142.
使用样例:在最小二乘实现线性回归中:
def olsr(dataMatrix,classLabels):
dataMatrix=np.mat(dataMatrix)
classLabels=np.mat(classLabels)
pinv_X=np.linalg.pinv(dataMatrix,0.01)#过滤掉小于(rcond=0.01*最大奇异值)的“小奇异值”
ws=pinv_X*classLabels.T#classLabels.T:保证classLabels.T为列向量
return ws#返回训练模型获得的系数
补充:
- 正交矩阵:
如果A是n阶矩阵,满足AAT=ATA=E,则A是正交矩阵。
如果A是正交矩阵<->AT=A-1<->A的行列向量组是正交规范化向量组。且|A|=1或者-1
2.解决线性回归相关的函数还有numpy.linalg.lstsq
.参见:numpy.linalg.lstsq。该函数返回一个线性矩阵方程的最小二乘解。函数原型:
numpy.linalg.lstsq(a,b,rcond=-1)
.其中:
-
a相当于x-y坐标系中的x
-
b相当于x-y坐标系中的y。可以对b传入矩阵,那么返回的也将是一个矩阵。
-
rcond与pinv()中的参数值相同,目的在于减少小奇异值的影响。
>>>x=np.array([0,1,2,3]) >>>y=np.array([-1,0.2,0.9,2.1]) >>>A=np.vstack([x,np.ones(len(x))]).T#添加全为1的偏置单位,并转置 >>> A array([[ 0., 1.], [ 1., 1.], [ 2., 1.], [ 3., 1.]]) >>>m,c=np.linalg.lstsq(A,y)[0]#m,c即为该线性函数的系数