-
岭回归
- 如果数据的特征比样本点还多,数据特征
,样本个数
,即
,则计算
时会出错。因为
不是满秩矩阵,行列式为0,所以不可逆。
为了解决这个问题,统计学家引入了岭回归的概念。
- 岭回归最早是用来处理多于样本的情况,现在也用于在估计中加入偏差,从而得到最好的估计。同样也可以解决多重共线性问题。岭回归是一种有偏估计。
岭回归的代价函数:
线性回归标准方程法:
岭回归的求解:为岭系数,
为单位矩阵(对角线上全为1,其他元素都为0)
-
sklearn岭回归实战
-
import numpy as np from numpy import genfromtxt from sklearn import linear_model import matplotlib.pyplot as plt # 读入数据 data = genfromtxt("longley.csv",delimiter=',') # 切分数据 x_data = data[1:,2:] y_data = data[1:,1] # 创建模型 # 默认生成50个值 alphas_to_test = np.linspace(0.001, 1) # 创建模型,保存误差值 alphas 为岭回归系数 RidgeCV 交叉验证法 model = linear_model.RidgeCV(alphas=alphas_to_test, store_cv_values=True) model.fit(x_data, y_data) # 岭系数 print(model.alpha_) # loss值 print(model.cv_values_.shape) 0.40875510204081633 (16, 50) # 画图 # 岭系数跟loss值的关系 plt.plot(alphas_to_test, model.cv_values_.mean(axis=0)) # 选取的岭系数值的位置 plt.plot(model.alpha_, min(model.cv_values_.mean(axis=0)),'ro') plt.show() model.predict(x_data[2,np.newaxis]) array([88.11216213])
-
岭回归实战
-
import numpy as np from numpy import genfromtxt import matplotlib.pyplot as plt # 读入数据 data = genfromtxt(r"longley.csv") # 切分数据 x_data = data[1:,2:] y_data = data[1:,1,np.newaxis] # 给样本添加偏置项 X_data = np.concatenate((np.ones((16,1)),x_data),axis=1) # 岭回归标准方程法求解回归参数 def weights(xArr, yArr, lam=0.2): xMat = np.mat(xArr) yMat = np.mat(yArr) xTx = xMat.T*xMat # 矩阵乘法 rxTx = xTx + np.eye(xMat.shape[1])*lam # 计算矩阵的值,如果值为0,说明该矩阵没有逆矩阵 if np.linalg.det(rxTx) == 0.0: print("This matrix cannot do inverse") return # xTx.I为xTx的逆矩阵 ws = rxTx.I*xMat.T*yMat return ws #参数 ws = weights(X_data,y_data) # 计算预测值 np.mat(X_data)*np.mat(ws) matrix([[ 83.55075226], [ 86.92588689], [ 88.09720227], [ 90.95677622], [ 96.06951002], [ 97.81955375], [ 98.36444357], [ 99.99814266], [103.26832266], [105.03165135], [107.45224671], [109.52190685], [112.91863666], [113.98357055], [115.29845063], [117.64279933]])
相关文章: