1.基本问题
线性回归属于有监督的算法,用来做回归预测。在实际的有监督回归问题中,我们通过拟合系数 的线性模型,以最小化数据集中观察到的响应y与线性近似预测的响应之间的残差平方和。我们的目标便是选择出可以使得残差平方和最小的模型参数,即得到代价函数
表达方式:
(1)单变量线性回归(因为只含有一个特征/输入变量)
其中,是此线性模型的参数,是输入变量,是样本个数,是真实值。
(2)多变量线性回归(含有n个特征/输入变量)
这个公式中有个参数和个变量,为了使公式能够简化一些,引入一个变量,则公式转化为:
此时模型中的参数是一个维的向量,将公式简化如下:
其中, ,
2.公式推导(求解代价函数)
(1)梯度下降
梯度下降背后的思想是:开始时我们随机选择一个参数的组合,计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到得到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。
批量梯度下降(batch gradient descent)算法的公式为:
其中是学习率,它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。
梯度下降中,我们要更新
求导过程(单变量):
算法为:
求导过程(多变量):
”批量梯度下降”,指的是在梯度下降的每一步中,我们都用到了所有的训练样本,在梯度下降中,在计算微分求导项时,我们需要进行求和运算,所以,在每一个单独的梯度下降中,我们最终都要计算这样一个东西,这个项需要对所有m个训练样本求和。
由上面的单变量求导过程我们可以得到多变量的求导结果:
同时,我们也可以类似于简化多变量模型一样来对此公式向量化。
其中,,,
(2)正规方程:
对于某些线性回归问题,正规方程方法是更好的解决方案,个人觉得在写代码的时候用着也方便。正规方程是通过求解方程:来找出使得代价函数最小的参数的。解得 :
正规方程求解过程(以多变量为例):
将带入得到(即向量表达式转化为矩阵表达式):
其中为行列的矩阵(为样本个数,为特征个数),为行1列的矩阵,为行1列的矩阵,对J进行如下变换
对θ求偏导,其中用到两个公式,,因此:
令可得:
3.代码部分:
在sklearn中可以直接调用,下面是一个简单的例子。
from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
diabetes = datasets.load_diabetes()
diabetes_X = diabetes.data
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
regr = LinearRegression() # Create linear regression object
regr.fit(diabetes_X_train, diabetes_y_train) # Train the model using the training sets
diabetes_y_pred = regr.predict(diabetes_X_test) # Make predictions using the testing set
print('Coefficients: \n', regr.coef_) # The coefficients
# The mean squared error
print("Mean squared error: %.2f" % mean_squared_error(diabetes_y_test, diabetes_y_pred))
# Explained variance score: 1 is perfect prediction
print('Variance score: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))
4.参考
(2)Coursera-ML-AndrewNg-Notes-master