【1】引言
前序学习进程中,已经掌握了岭回归的基本定义,本次就更进一步,学习岭回归的一个实例。
【2】代码解读
今天的学习通过官网示例进行:
岭回归官网示例代码
首先给出完整代码:
# 引入必要模块
import numpy as np
import matplotlib.pyplot as plt
# 引入线性模型
from sklearn import linear_model
# X is the 10x10 Hilbert matrix
# 这里包括两个步骤
# 第一步,生成[1,2,...,10]的一维数组,一共10个数,组成一个行向量
# 第二步,生成[0,1,...,9]的一维数组,一共十个数,然后增加一个轴,转化为10行1列的二维矩阵,实际上是一个列向量
# 第三步,加号"+"串联起两个数组,并且数组自动广播,都变成10行10列的二维矩阵
# 二维矩阵相加的结果是,位置为(i,j)的元素实际上是第(i+1,j+1)的元素,比如第一行第一列的元素位置被记录为(0,0)而非(1,1)
# 执行加法计算后,元素位置为(i,j)处的计算结果为(i+1+j)
# 最后获得的X则是对加法计算的矩阵在每个位置再计算倒数后的值
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
# y是一个纯1矩阵,一共10个数
y = np.ones(10)
# #############################################################################
# Compute paths
# 定义常数n_alphas = 200
n_alphas = 200
# 定义以10为底数的对数,真数从-10到-2均匀变化,一共输出n_alphas个/200个数
alphas = np.logspace(-10, -2, n_alphas)
# 定义一个空列表
coefs = []
for a in alphas:
# ridge定义了一个岭回归对象
ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
# 执行岭回归计算
ridge.fit(X, y)
# ridge.coef_是岭回归计算出来的系数
# 本例中,由于每一行的样本是10个特征,所以有10个系数
# 每一行样本都会使用这10个系数
coefs.append(ridge.coef_)
# #############################################################################
# Display results
ax = plt.gca()
ax.plot(alphas, coefs)
ax.set_xscale('log')
ax.set_xlim(ax.get_xlim()[::-1]) # reverse axis
plt.xlabel('alpha')
plt.ylabel('weights')
plt.title('Ridge coefficients as a function of the regularization')
plt.axis('tight')
plt.show()
【2.1】引入必要模块
# 引入必要模块
import numpy as np
import matplotlib.pyplot as plt
# 引入线性模型
from sklearn import linear_model
这里引入了必要模块,相对简单。
【2.2】岭回归计算
岭回归计算其实非常简单,首先定义了10X10的因变量样本矩阵和10个数字组成的自变量样本矩阵,然后直接进行岭回归计算,再把计算获得的岭回归系数都储存起来:
# X is the 10x10 Hilbert matrix
# 这里包括两个步骤
# 第一步,生成[1,2,...,10]的一维数组,一共10个数,组成一个行向量
# 第二步,生成[0,1,...,9]的一维数组,一共十个数,然后增加一个轴,转化为10行1列的二维矩阵,实际上是一个列向量
# 第三步,加号"+"串联起两个数组,并且数组自动广播,都变成10行10列的二维矩阵
# 二维矩阵相加的结果是,位置为(i,j)的元素实际上是第(i+1,j+1)的元素,比如第一行第一列的元素位置被记录为(0,0)而非(1,1)
# 执行加法计算后,元素位置为(i,j)处的计算结果为(i+1+j)
# 最后获得的X则是对加法计算的矩阵在每个位置再计算倒数后的值
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
# y是一个纯1矩阵,一共10个数
y = np.ones(10)
# #############################################################################
# Compute paths
# 定义常数n_alphas = 200
n_alphas = 200
# 定义以10为底数的对数,真数从-10到-2均匀变化,一共输出n_alphas个/200个数
alphas = np.logspace(-10, -2, n_alphas)
# 定义一个空列表
coefs = []
for a in alphas:
# ridge定义了一个岭回归对象
ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
# 执行岭回归计算
ridge.fit(X, y)
# ridge.coef_是岭回归计算出来的系数
# 本例中,由于每一行的样本是10个特征,所以有10个系数
# 每一行样本都会使用这10个系数
coefs.append(ridge.coef_)
【2.3】画图
最后一部非常简单,展示每一个系数随着惩罚系数的变化而变化的趋势:
# Display results
ax = plt.gca()
ax.plot(alphas, coefs)
ax.set_xscale('log')
ax.set_xlim(ax.get_xlim()[::-1]) # reverse axis
plt.xlabel('alpha')
plt.ylabel('weights')
plt.title('Ridge coefficients as a function of the regularization')
plt.axis('tight')
plt.show()
【3】总结
通过一个python实例进一步了解了岭回归计算。