线性回归与非线性回归:1.8岭回归 及实战

  • 岭回归 

  • 如果数据的特征比样本点还多,数据特征 线性回归与非线性回归:1.8岭回归 及实战,样本个数 线性回归与非线性回归:1.8岭回归 及实战,即 线性回归与非线性回归:1.8岭回归 及实战,则计算 线性回归与非线性回归:1.8岭回归 及实战 时会出错。因为 线性回归与非线性回归:1.8岭回归 及实战 不是满秩矩阵,行列式为0,所以不可逆。

    为了解决这个问题,统计学家引入了岭回归的概念。
     
  • 岭回归最早是用来处理多于样本的情况,现在也用于在估计中加入偏差,从而得到最好的估计。同样也可以解决多重共线性问题。岭回归是一种有偏估计。

    岭回归的代价函数:线性回归与非线性回归:1.8岭回归 及实战

    线性回归标准方程法:线性回归与非线性回归:1.8岭回归 及实战

    岭回归的求解:线性回归与非线性回归:1.8岭回归 及实战

    线性回归与非线性回归:1.8岭回归 及实战 为岭系数,线性回归与非线性回归:1.8岭回归 及实战 为单位矩阵(对角线上全为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])


     

    线性回归与非线性回归:1.8岭回归 及实战
     

  • 岭回归实战

  • 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]])
    ​