岭回归

岭回归

1、原理

# 线性回归可以求解 各个特征的权重
# 但是如果特征比样本还多 这个时候用线性回归就无法求解了

# 三元一次方程组
y1 = w1*x11 + w2*x21 +  w3*x31
y2 = w1*x12 + w2*x22 +  w3*x32
y3 = w1*x13 + w2*x23 +  w3*x33

1 2 3
2 4 6
4 8 12

10
20
40

w1*1 + w2*2 +  w3*3 = 10
w1*2 + w2*4 +  w3*6 = 20
w1*4 + w2*8 +  w3*12 = 40

1 2  3
2 4  6
4 8 12

1 2  3   1 0 0   2 2  3
2 4  6 + 0 1 0 = 2 5  6
4 8 12   0 0 1   4 8 12


# 通过人为引入 偏差 使得方程有解

# 使得 样本数 < 特征数 的方程 有解
# 比如一个图片 成百上千个特征 样本数没有特征数那么多
X = np.array([
    [1,2,3],
    [2,4,6],
    [4,8,12]
])

y = np.array([10,20,40])

# (X.T*X)^-1*X.T*y
import numpy as np
np.linalg.inv(np.dot(X.T,X))  # Singular matrix 奇异矩阵  # 没法计算
0.5*np.eye(3)
np.linalg.inv(np.dot(X.T,X)+0.5*np.eye(3))

2、实例

使用岭回归

岭回归一般用在样本值不够的时候

from sklearn import datasets  # 从sklearn中获取数据集
diabetes = datasets.load_diabetes()  # 加载糖尿病数据
data = diabetes.data  # 特征值
target = diabetes.target  # 目标值
import pandas as pd
pd.DataFrame(data,columns=diabetes.feature_names)
from sklearn.linear_model import Ridge  # Ridge 山岭

# alpha就相当于上面公式中的lambda 用来空值引入的偏差的大小
# 默认值是1 相当于 引入了一个单位矩阵
# 一般 我们还可以设置成 0.1 0.01 0.001 引入的偏差就小了
# 如果 10 100 1000 引入的偏差就会很大 
rr = Ridge(alpha=1000)
# 如果alpha是0(没有引入偏差 就和普通线性回归完全一样)
# 如果alpha太大 原来的权重就都成0了(各个特征和结果是无关的)
rr.fit(data,target)
rr.coef_  # 使用岭回归 估测出来的 各个特征的权重

# 和线性回归做对比
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(data,target)
lr.coef_  # 普通线性回归 估测出来的 各个特征的权重

 

 

 

posted @ 2018-11-22 17:26  Sakura_L  阅读(713)  评论(0编辑  收藏  举报