网站建设需要多少钱知乎,推广计划和推广单元,做网站 以图搜货,wordpress 4.5.3 安装如果数据特征比样本点还多#xff0c;是不可以使用线性回归的#xff0c;因为在计算的时候会出错。
如果特征比样本点还多#xff08;nm#xff09;#xff0c;也就是说输入数据的矩阵x不是满秩矩阵。非满秩矩阵在求逆时会出问题。
为了解决上述问题#xff0c;可以…如果数据特征比样本点还多是不可以使用线性回归的因为在计算的时候会出错。
如果特征比样本点还多nm也就是说输入数据的矩阵x不是满秩矩阵。非满秩矩阵在求逆时会出问题。
为了解决上述问题可以使用岭回归接着是lasso法该方法效果很好但是计算复杂。还有前向逐步回归可以得到与lasso相似的效果且更容易实现。
岭回归
简单来说岭回归就是在矩阵上加一个从而使得矩阵非奇异进而能对求逆。其中矩阵I是一个m*m的单位矩阵对角线上元素全是1其他元素全为0。而是一个用户定义的数值。在这种情况下回归系数的计算公式将变成 岭回归最先用来处理特征数多余样本数的情况现在也用于子啊估计中加入偏差从而得到更好的估计。这里通过引入来限制了所有w之和通过引入该惩罚项能够减少不必要的参数这个技术在统计学中也叫做缩减。
缩减方法可以去掉不重要的参数因此能更好地理解数据。此外和简单的线性回归相比错减法能取得更好的预测效果。
与之前用到的训练其他参数所用方法类似通过预测误差最小化得到数据获取之后首先抽一部分数据用于测试剩余的作为训练集用于训练参数w。训练完毕后再测试集上测试预测性能。通过选取不同的来重复上述测试过程最终得到一个使预测误差最小的。
岭回归代码实现
def ridgeRegres(xMat,yMat,lam0.2):xTxxMat.T*xMatdenomxTxeye(shape(xMat)[1])*lamif linalg.det(denom)0.0:print(行列式为0)return wsdenom.I*(xMat.T*yMat)return wsdef ridgeTest(xArr,yArr):xMatmat(xArr)yMatmat(yArr).TyMeanmean(yMat,0)yMatyMat-yMeanxMeansmean(xMat,0)xVarvar(xMat,0)xMat(xMat-xMeans)/xVarnumTestPets30wMatzeros((numTestPets,shape(xMat)[1]))for i in range(numTestPets):wsridgeRegres(xMat,yMat,exp(i-10))wMat[i,:]ws.Treturn wMat
上述代码包含两个函数ridgeRegres()用于计算回归系数而函数ridgeTest()用于在一组上测试结果。
第一个函数ridgeRegres()实现了给定lambda下的岭回归求解。如果没有指定lambda则默认为0.2。由于lambda是Python保留的关键字所以代码中用lam代替。函数首先构建矩阵然后用lam乘以单位矩阵。在普通回归方法可能会产生错误时岭回归仍然可以正常工作。这里需要做一个检查。最后如果矩阵非奇异就计算回归系数并返回。
为了使用岭回归和缩减技术首先需要对特征做标准化处理使每维特征具有相同的重要性。ridgeRegres()展示了数据标准化过程。具体的做法就是所有特征都减去各自的均值并除以方差。
处理完成后就可以在30个不同lambda下调用ridgeRegres()函数。这里的lambda应该以指数级变化这样可以看出lambda在取非常小的值时和取非常大的值时分别对结果造成的影响。最后将所有的回归系数输出到一个矩阵并返回。
尝试在鲍鱼数据集上运行
abX,abYloadDataSet(abalone.txt)
ridgeWeightsridgeTest(abX,abY)
import matplotlib.pyplot as plt
figplt.figure()
axfig.add_subplot(111)
ax.plot(ridgeWeights)
plt.show() 上图绘制出了回归系数与的关系。在最左边即最小时可以得到所有系数的原始值与线性回归一致而在右边系数全都缩减为0在中间部分的某值将可以取得最好的预测效果。为了定量的找到最佳参数值还需要进行交叉验证。另外还要判断哪些变量对结果预测最具有影响力。
lasso
不难证明在增加下面的约束时普通的最小二乘法回归会得到与岭回归一样的公式 上面的表达式限定了所有回归系数的平方和不能大于。使用最小二乘法回归在当两个或更多的特征相关时可能会得出一个很大的正系数和一个很大的负系数。正式因为上述限制条件的存在使得岭回归可以避免这个问题。
与岭回归类似另一个缩减方法lasso也对回归系数做了限定限定条件如下 唯一不同的点在于这个约束条件用绝对值代替了平方和。虽然约束形式只是稍作变化结果却完全不同在足够小的时候一些系数会因此被迫缩减到0这个特性可以帮助我们更好地理解数据。这两个约束条件在看起来相差无几但是极大地增加了计算复杂度。
前向逐步回归
前向逐步回归算法可以得到与lasso差不多的效果但更简单。它属于一种贪心算法即每一步都尽可能减少误差。一开始所有的权重都设置为1然后每一步所做的决策是对某个权重增加或者减少到一个很小的值。
该算法的伪代码如下 数据标准化使其分布满足0均值和单位方差 在每轮迭代过程中 设置当前最小误差lowestError为正无穷 对每个特征 增大或缩小 改变一个系数得到一个新的w 计算新w下的误差 如果误差Error小于当前最小误差lowestError设置Wbest等于当前的W 将w设置为新的Wbest 实际代码实现
def stageWise(xArr,yArr,eps0.01,numIt100):#转换数据并存入矩阵xMatmat(xArr)yMatmat(yArr).TyMeanmean(yMat,0)yMatyMat-yMean#xMatregularize(xMat)m,nshape(xMat)returnMatzeros((numIt,n))#创建向量ws来保存w的值wszeros((n,1))wsTestws.copy()wsMaxws.copy()#循环numIt次并且在每次迭代时都打印出w向量用于分析算法执行的过程和效果for i in range(numIt):print(ws.T)lowestErrorinffor j in range(n):for sign in [-1,1]:wsTestws.copy()wsTest[j]wsTest[j]eps*signyTestxMat*wsTestrssErssError(yMat.A,yTest.A)if rssElowestError:lowestErrorrssEwsMaxwsTestwswsMax.copy()returnMat[i,:]ws.Treturn returnMat
上述stageWise()是一个逐步线性回归算法的实现它与lasso做法相近但计算简单。该函数的输入包括输入数据xArr和预测变量yArr。此外还有两个参数一个是eps表示每次迭代需要调整的步长另一个是numIt表示迭代次数。
函数首先将输入数据转换并存入矩阵中然后把特征按照均值为0方差为1进行标准化处理。在这之后创建了一个向量ws来保存w的值并且为了实现贪心算法建立了ws的两份副本。接下来的优化过程需要迭代numIt次并且在每次迭代时都打印出w向量用于分析算法执行的过程和效果。
贪心算法在所有特征上运行两次for循环分别计算增加或减少该特征对误差的影响。这里使用的是平方误差通过之前的函数rssError()得到。该误差初始值设为正无穷经过与所有的误差比较后取最小的误差整个过程循环迭代进行。
xArr,yArrloadDataSet(abalone.txt)
print(stageWise(xArr,yArr,0.01,200)) 上述结果中w1和w6都是0表示他们不对目标值造成任何影响也就是说这些特征很可能是不需要的。另外在参数eps设置为0.01时一段时间后系数就已经饱和并在特定值之间来回震荡这是因为步长太大的缘故。 xMatmat(xArr)
yMatmat(yArr).T
yMmean(yMat,0)
yMatyMat-yM
weightsstandRegres(xMat,yMat.T)
print(weights.T) 逐步线性回归算法的主要优点在于它可以帮助人们理解现有的模型并做出改进当构建了一个模型后可以运算该算法找出重要的特征这样就有可能及时停止对那些不重要特征的收集。最后如果用于测试该算法每100次迭代后就可以构建出一个模型可以使用类似于10折交叉验证的方法比较这些模型最终选择使误差最小的模型。
当应用缩减方法比如逐步线性回归或岭回归时模型也就增加了偏差与此同时却减小了模型的方差。