机器学习-线性回归-最小二乘法

线性回归-最小二乘法

概述

给定包含正确答案的样本数据集,选择一个概念函数H,并为H找到适应样本数据集的最优参数,从而建立预测模型为新查询数据预测答案。

线性最小二乘法原理

对于已知的样本数据集,可以用线性方程组表示为:


m表示有m个线性方程,n表示有n个未知数,也就是样本数据集是n维,矩阵表示为:


该方程组一般而言没有解,只能选取最合适的让等式尽量成立,引入残差平方和函数:


取得最小值时的解记为


使用求导方法求得极值,可以得到:


如果矩阵为非奇异矩阵则有唯一解:


普通最小二乘法就是拟合一个带有系数的线性模型,使得数据集实际观测数据和预测数据之间的残差平方和最小。回归评价指标最常用的有均方误差根(RMSE)和R平方(R2),详细的回归评价指标参考其他文章。

普通最小二乘法示例:
__author__ = 'gytan'
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

# load the diabetes dataset
diabetes = datasets.load_diabetes()

# use only one feature
diabetes_X = diabetes.data[:, np.newaxis, 2]

# split the data into training/testing sets
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]

# split the targets into training/testing sets
diabetes_Y_train = diabetes.target[:-20]
diabetes_Y_test = diabetes.target[-20:]

# create linear regression object
regr = linear_model.LinearRegression()

# train the model using the training sets
regr.fit(diabetes_X_train, diabetes_Y_train)

# make predictions using the testing set
diabetes_Y_pred = regr.predict(diabetes_X_test)

# the coefficients
print('Coefficients: \n', regr.coef_)

# the mean squared error
print("Mean squared error: %.2f"%mean_squared_error(diabetes_Y_test, diabetes_Y_pred))

# explained variance score: 1 is perfect rediction
print("Variance score: %.2f"%r2_score(diabetes_Y_test, diabetes_Y_pred))

# plot outputs
plt.scatter(diabetes_X_test, diabetes_Y_test, color = 'black')
plt.plot(diabetes_X_test, diabetes_Y_pred, color = 'blue', linewidth = 3)

plt.xticks(())
plt.yticks(())

plt.show()

对于普通最小二乘法的系数估计问题,其依赖于样本数据各项的相互独立性。当各项是相关的,且矩阵X的各列近似线性相关,这就是多重共线性问题,这会导致最小二乘法估计对于随机误差非常敏感,产生较大的方差。

岭回归

岭回归是一种专用于共线性数据的回归方法,实质是一种改进的最小二乘法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要好于普通最小二乘法。

岭回归使用X的奇异值分解来计算最小二乘解,通过对系数的大小施加惩罚来解决普通最小二乘法的共线性问题。

残差平方和取最小值时:


I为单位矩阵。

如果增大,则中各元素的绝对值趋于变小,相对于正确的偏差越来越大,当趋向于无穷大时,趋于0。的改变而改变的轨迹称为岭迹。实际应用中,可以选取非常多的值来计算非常多的,做出一个岭迹图,观察图形轨迹稳定的位置来确认值。

岭回归是对普通最小二乘法的改进,损失了无偏性来换取高的数值稳定性,从而得到较高的计算精度。

岭回归轨迹示例:
__author__ = 'gytan'
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model

#
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
Y = np.ones(10)

# compute paths
n_alphas = 200
alphas = np.logspace(-10, -2, n_alphas)

coefs = []
for a in alphas:
    ridge = linear_model.Ridge(alpha = a, fit_intercept = False)
    ridge.fit(X, Y)
    coefs.append(ridge.coef_)

# results
ax = plt.gca()
ax.plot(alphas, coefs)
ax.set_xscale('log')
ax.set_xlim(ax.get_xlim()[::-1])
plt.xlabel('alpha')
plt.ylabel('weights')
plt.title('Ridge coefficients as a function of the regularization')
plt.axis('tight')
plt.show()

猜你喜欢

转载自blog.csdn.net/bedrock_stable/article/details/79607051