链接: 1. 线性回归总结 2. 正则化 3. 逻辑回归 4. Boosting 5. Adaboost算法


一. 模型介绍

线性回归简而言之就是在平面中用一条直线去拟合一些点数据,在三维空间中就是用一个平面去拟合三维中的数据,而我们要做的就是寻找出一条最佳的线段或者平面去拟合数据,当然高维情况类似去寻找超平面。 初中的时候我们就学习过一元一次方程,那就是一个简单的拟合过程,只不过那个是完全可以拟合在一条线上,现在要做的是在有误差或者数据非线性排列的情况下,我们只能去尽力找出一条最佳的拟合线路:

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1,10,2).reshape(-1,1)
y = a*2 
plt.plot(x,y,'r-',linewidth=2, label=u"线性拟合")
plt.plot(x,y, 'bo')
plt.show()

完全拟合,二元一次方程组求解;(数据线性情况下)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

x = np.arange(1,10,2).reshape(-1,1)
y = a*2 + np.random.randn(5)
linear_model = LinearRegression()
linear_model.fit(x.reshape(-1, 1),y)
y_pre = linear_model.predict(x)
plt.plot(x,y_pre,'r-',linewidth=2, label=u"线性拟合")
plt.plot(x,y, 'bo')
plt.show()

线性回归;寻找最佳的拟合线段;(数据非线性情况下)

定义一下一些符号表达,我们通常习惯用X=(x1,x2,…,xn)T∈ℝn×p表示数据矩阵,其中xi∈ℝp表示一个p维度长的数据样本;y=(y1,y2,…,yn)T∈ℝn表示数据的label,这里只考虑每个样本一类的情况。

线性回归的模型是这样的,对于一个样本xi,它的输出值是其特征的线性组合:

线性表达式

其中,w0称为截距,或者bias,通过设置X中X0=1,向量表达,简化了形式,因此实际上xi有p+1维度。 线性回归的目标是用预测结果尽可能地拟合目标label,

二. 损失函数

从下图来直观理解一下线性回归优化的目标——图中线段距离(平方)的平均值,也就是最小化到分割面的距离和。 三维中拟合后的情况

这里我们要做的是在随机放置权值W的情况下不断的优化程式,以达到效果最佳的情况,这里的优化指的是尽量让各个点拟合在所求超平面,如果不能拟合,也要使得其距离超平面最近为好,也就是可以定义损失函数

损失函数

三. 求解过程

由于上述损失函数图形如下,我们这里选用两种方式去求解 J(θ)平面

1. 矩阵满秩:###

这种形式下我们可以通过求解导数为零的方式求解算法,可以直接得到最后的W权值. 矩阵形式转换 求解过程

1. 矩阵不满秩:###

  当矩阵不满秩,无法求得上述的矩阵逆解,这里采用梯度下降法进行求解,梯度下降法通常分为三种形式:整体批次梯度下降法,随机梯度下降法和批量梯度下降法.   梯度下降算法是一种求局部最优解的方法,对于F(x),在a点的梯度是F(x)增长最快的方向,那么它的相反方向则是该点下降最快的方向,具体参考wikipedia。    原理:将函数比作一座山,我们站在某个山坡上,往四周看,从哪个方向向下走一小步,能够下降的最快;注意:当变量之间大小相差很大时,应该先将他们做处理,使得他们的值在同一个范围,这样比较准确。     1)首先对θ赋值,这个值可以是随机的,也可以让θ是一个全零的向量。     2)改变θ的值,使得J(θ)按梯度下降的方向进行减少。  描述一下梯度减少的过程,对于我们的函数J(θ)求偏导J:  下图表达出解得最终结果与初始值相关: 梯度下降方式

在这里我们需要进行的是: 迭代公式

  在批量梯度下降中,每一次参数更新都会遍历全部的训练数据{x1, y1}, {x2, y2}, … , {xm,ym}对于线性回归问题,这种方法可以得到一个全局最优解,但是当样本数据量很大的时候,会非常耗时。

多项式回归

我们可以通过设计高阶特征在线性回归的基础上实现多项式回归。对于线性回归的hypothesis, 令$x2=x1^2,x3=x1^3$,实现了一个3次多项式的回归: 这也是用线性模型实现非线性的常用方法。这种方式能够拟合出非线性的超平面,有时候表现出很好的特性

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
X_train = [[6], [8], [10], [14], [18]]
y_train = [[7], [9], [13], [17.5], [18]]
X_test = [[6], [8], [11], [16]]
y_test = [[8], [12], [15], [18]]

quadratic_featurizer = PolynomialFeatures(degree=2)
X_train_quadratic = quadratic_featurizer.fit_transform(X_train)
X_test_quadratic = quadratic_featurizer.transform(X_test)
xx = np.linspace(0, 26, 100)
regressor_quadratic = LinearRegression()
regressor_quadratic.fit(X_train_quadratic, y_train)
xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1))
plt.plot(xx, regressor_quadratic.predict(xx_quadratic), 'r-')
plt.show()

多项式回归与一般线性回归对比

线性回归代码地址

参考: 机器学习方法:回归(一):线性回归Linear regression 机器学习—–线性回归浅谈(Linear Regression) Stanford机器学习笔记-1.线性回归 线性回归