算法模型---回归模型

本文参考线性回归之最小二乘法线性回归浅谈html

线性回归模型与最小二乘法

一、基本概念

线性回归假设因变量与自变量之间存在线性关系,因变量可经过自变量线性叠加而获得,即因变量和自变量之间可用以下方式表示。
python

y = w 0 + w 1 x 1 + w 2 x 2 + . . . + w n x n

式中 x 1 , . . . , x n 为自变量, w 1 , . . . , w n 为权重系数, w 0 为偏置。
线性回归就是要解决如何利用样本求取 w 1 , . . . , w n w 0 ,拟合出上述表达式,得到最佳直线的问题。最经常使用的就是最小二乘法。
最小二乘法:最佳拟合线下,将已知样本的自变量代入拟合直线,获得的观测值与实际值之间的偏差平方和最小。web

二、一元线性回归

为了好理解,先从简单的状况开始,即一元线性回归。算法

2.一、利用方程组来解系数

假设因变量和自变量可用以下函数表示:
y = a x + b 对于任意样本点 ( x i , y i ) ,有偏差 e = a x i + b y i ,偏差平方和 1 n e 2 = 1 n ( a x i + b y i ) 2
那什么样的a和b会使得偏差平方和最小呢?
上面是求最值的问题,咱们会想到导数和偏导数,这里在偏导数等于0的地方能取到极值,而且也是最值。
分别对a和b求偏导获得以下表达式:
sql

(1) a = i = 1 n 2 x i ( a x i + b y i ) (2) b = i = 1 n 2 ( a x i + b y i )

经过对二元一次方程组
(3) i = 1 n 2 x i ( a x i + b y i ) = 0 (4) i = 1 n 2 ( a x i + b y i ) = 0

进行求解,能够获得以下解:
(5) a = n i = 1 n x i y i i = 1 n x i i = 1 n y i n i = 1 n x i 2 ( i = 1 n x i ) 2 (6) b = i = 1 n x i 2 y i i = 1 n x i i = 1 n x i y i n i = 1 n x i 2 ( i = 1 n x i ) 2

上面的数学过程用代码表示以下:

import numpy as np
import matplotlib.pyplot as plt

def calcAB(x,y):
    n = len(x)
    sumX, sumY, sumXY, sumXX = 0, 0, 0, 0
    for i in range(0, n):
        sumX += x[i]
        sumY += y[i]
        sumXX += x[i] * x[i]
        sumXY += x[i] * y[i]
    a = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX)
    b = (sumXX * sumY - sumX * sumXY) / (n * sumXX - sumX * sumX)
    return a, b
xi = [1,2,3,4,5,6,7,8,9,10]
yi = [10,11.5,12,13,14.5,15.5,16.8,17.3,18,18.7]
a,b=calcAB(xi,yi)
print("y = %10.5fx + %10.5f" %(a,b))
x = np.linspace(0,10)
y = a * x + b
plt.plot(x,y)
plt.scatter(xi,yi)
plt.show()

数据散点和拟合的直线以下:
这里写图片描述apache

2.二、利用矩阵的方法来求解系数

函数 y = a x + b
也能够表示成以下的形式
y = w 0 + w 1 x = W T x = ( x W ) T 数组

式中 W = [ w 0 , w 1 ] T , x = [ 1 , x i ] T 网络

对于n个样本,此时损失函数(即偏差平方和)为:
数据结构

L = i = 1 n ( y i W T x i ) 2

假如咱们将样本表示成以下形式:
app

Y = [ y 1 , y 2 , . . . , y n ] T

X = [ 1 , x 1 1 , x 2 . . . 1 , x n ]


(7) Y X W = [ y 1 ( w 0 + w 1 x 1 ) y 2 ( w 0 + w 1 x 1 ) . . . y n ( w 0 + w 1 x n ) ] (8) ( Y X W ) T = [ y 1 ( w 0 + w 1 x 1 ) , y 2 ( w 0 + w 1 x 1 ) , . . . , y n ( w 0 + w 1 x n ) ] (9) ( Y X W ) T ( Y X W ) = i = 1 n ( y i W T X i ) 2 (10) = L

进一步,能够将损失函数表示以下形式:
L = Y T Y w T Y Y X W + W T X T X W

L对W求导,可获得
α L α w = 2 Y T X + 2 W T X T X

令导数为0,则有
w T X T X = Y T X

从而
( w T X T X ) T = ( Y T X ) T

进而能够求得
W = ( X T X ) 1 X T Y

上面的数学过程用代码表示以下:

x = [1,2,3,4,5,6,7,8,9,10]
y = [10,11.5,12,13,14.5,15.5,16.8,17.3,18,18.7]
X = np.vstack([np.ones(len(x)),x]).T
Y = np.array(y).T
W=np.dot(np.matrix(np.dot(X.T,X))**-1,np.dot(X.T,Y))
yi=np.dot(X,W.T)#这里公式里是不须要转置的,但因为矩阵运算时W自动保存成一行多列的矩阵,因此多转置一下,配合原公式的计算。
print(X)
print(Y)
print(W)
print(yi)#拟合出的预测点
plt.plot(x,y,'o',label='data',markersize=10)
plt.plot(x,yi,'r',label='line')
plt.show()

结果以下:

X=
[[ 1. 1.] [ 1. 2.] [ 1. 3.] [ 1. 4.] [ 1. 5.] [ 1. 6.] [ 1. 7.] [ 1. 8.] [ 1. 9.] [ 1. 10.]]
Y=
[ 10.   11.5  12.   13.   14.5  15.5  16.8  17.3  18.   18.7]
W=
[[ 9.30666667 0.98606061]]
yi=
[[ 10.29272727] [ 11.27878788] [ 12.26484848] [ 13.25090909] [ 14.2369697 ] [ 15.2230303 ] [ 16.20909091] [ 17.19515152] [ 18.18121212] [ 19.16727273]]

这里写图片描述

三、多元线性回归

将一元线性回归及回归系数的计算公式推广到多元线性回归也是同样。
损失函数可表示以下:

L = i = 1 m ( y i W T x i ) 2

对L求导有
L W = 2 i = 1 m ( y i W T x i ) ( 1 ) ( W T x i ) W = 2 i = 1 m ( W T x i y i ) ( W T x i ) W

不防令 W T x i y i = e i ,则上式可化简为
L W = 2 i = 1 m e i ( W T x i ) W = 2 i = 1 m e i ( w 0 + w 1 x i 1 + + w p x i p ) W

先计算 L W 各份量
L w 0 = 2 i = 1 m e i ( w 0 + w 1 x i 1 + + w p x i p ) w 0 = 2 i = 1 m e i 1 L w 1 = 2 i = 1 m e i ( w 0 + w 1 x i 1 + + w p x i p ) w 1 = 2 i = 1 m e i x i 1 = = L w p = 2 i = 1 m e i ( w 0 + w 1 x i 1 + + w p x i p ) w p = 2 i = 1 m e i x i p

L W 可写成
1 2 L W = [ i = 1 m e i 1 i = 1 m e i x i 1 i = 1 m e i x i p ] = [ e 1 + e x + + e m e 1 x 11 + e 2 x 21 + + e m x m 1 e 1 x 1 p + e 2 x 2 p + + e m x m p ] = [ 1 + x 11 + x 12 + + x 1 p 1 + x 21 + x 22 + + x 2 p 1 + x m 1 + x m 2 + + x m p ] T [ e 1 e m ]


[ 1 , x 11 , x 12 , , x 1 p 1 , x 21 , x 22 , , x 2 p 1 , x m 1 , x m 2 , , x m p ] = X

[ e 1 e m ] = E


1 2 L W = X T E

3.一、当矩阵满秩时(数据点的个数大于x的维度时)

令导数为0的方程组有足够的已知条件求解,令导数为0,则有

X T E = 0


E = [ e 1 e m ] = [ w 0 + w 1 x 11 + + w p x 1 p y 1 w 0 + w 1 x m 1 + + w p x m p y m ] = [ w 0 + w 1 x 11 + + w p x 1 p w 0 + w 1 x m 1 + + w p x m p ] [ y 1 y m ] = X W Y

则有
X T ( X W Y ) = 0 X T X W X T Y = 0 X T X W = X T Y

从而有
W = ( X T X ) 1 X T Y

3.二、当矩阵不满秩时

此时利用导数为0方程组个数不够,不可以所有解出参数,
可利用梯度降低法求近似最优解

W = W α L W = W 2 α X T E

而梯度降低步长初始化可随机设置,于是上式不防写成
W = W α L W = W α X T E

线性回归的并行化

pyspark.ml中的线性回归

#-*-coding:utf-8-*-

from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.ml.linalg import Vectors
from pyspark.ml.regression import LinearRegression

if __name__=="__main__":
    sc=SparkContext(appName="myApp")
    spark=SparkSession.builder.enableHiveSupport().getOrCreate()
    df = spark.createDataFrame([(1.0, 2.0, Vectors.dense(1.0)),(0.0, 2.0, Vectors.sparse(1, [], []))], ["label", "weight", "features"])
    lr = LinearRegression(maxIter=5, regParam=0.0, solver="normal", weightCol="weight")
    model = lr.fit(df)
    print(model.coefficients)
    print(model.intercept)
    test0 = spark.createDataFrame([(Vectors.dense(-1.0),)], ["features"])
    print(model.transform(test0).head().prediction)

spark中使用回归方法案例

参考《算法模型—回归模型—spark回归案例》

局部加权回归(LWR)

来源:https://www.cnblogs.com/sumai/p/5211558.html

RANSAC拟合高鲁棒性回归

来源:
这是对回归分析的提高,使得模型具备更好的抗干扰能力。
RANSAC(Random Sample Consenus),它是根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,获得有效样本数据的算法。使用数据的一个子集(内点,Ran)来进行回归模型的拟合。

RANSAC算法的工做流程以下:
一、从数据集中随机抽取样本构建内点集合拟合模型。
二、使用剩余的数据对上一步获得的模型进行测试,并将落在预约公差范围内的样本点增长到内点集合中。
三、使用所有的内点集合数据再次进行模型的拟合。
四、使用内点集合来估计模型的偏差。
五、若是模型性能达到了用户设定的特定阈值或者迭代的次数达到了预约的次数,则算法终止,不然重复从第一步开始。

from sklearn.linear_model import RANSACRegressor
'''
max_trials设置最大迭代次数为100
min_samples随机抽取内点的最小样本数为50
residual_metric计算拟合曲线与样本点的距离的绝对值
residual_threshold设置预约公差,小于这个值才被加入到内点集合
'''
ransac = RANSACRegressor(LinearRegression(),max_trials=100,min_samples=50,
                        residual_metric=lambda x:np.sum(np.abs(x),axis=1),
                        residual_threshold=5.0,random_state=0)
ransac.fit(X,Y)
inlier_mask = ransac.inlier_mask_
outlier_mask = np.logical_not(inlier_mask)
line_X = np.arange(3,10,1)
line_y_ransac = ransac.predict(line_X[:,np.newaxis])
plt.scatter(X[inlier_mask],Y[inlier_mask],c="blue",marker="o",label="内点")
plt.scatter(X[outlier_mask],Y[outlier_mask],c="lightgreen",marker="s",label="异常值")
plt.plot(line_X,line_y_ransac,color="red")
plt.xlabel("房间数")
plt.ylabel("房价")
plt.legend(loc="upper left")
plt.show()

线性回归模型性能的评估

一、残差图
经过绘制残差图可以直观的发现真实值与预测值之间的差别或垂直距离,经过真实值与预测值之间的差别来对回归模型进行评估。残差图能够做为图形分析方法,能够对回归模型进行评估、获取模型的异常值,同时还能够检查模型是不是线性的,以及偏差是否随机分布。

最好的模型预测结果的残差为0,在实际应用中,这种状况是不可能发生的。可是,对于一个好的模型,咱们指望偏差是随机分布的,同时残差也是在y=0水平线附近波动。经过残差图也能够发现异常值,偏离y=0比较远的点。
二、均方偏差(MSE)
均方偏差(Mean Squared Error,MSE):真实值与预测值差的平方和的平均值,计算公式以下

M S E = 1 n i = 1 n ( y i y ^ i ) 2

from sklearn.metrics import mean_squared_error
print("train MSE:%.3f"%mean_squared_error(train_y,train_y_pred))
#train MSE:46.037
print("test MSE:%.3f"%mean_squared_error(test_y,test_y_pred))
#test MSE:35.919

除了均方偏差以外,还能够经过绝对值偏差来衡量模型的性能。
三、决定系数R^2
在某些状况下决定系数(coefficient of determination) R 2 很是重要,能够将其当作一个MSE标准化版本, R 2 是模型捕获响应方差的分数。对于训练集来讲, R 2 的取值范围为[0,1],对于测试集来讲, R 2 取值可能为负。若是R^2越接近与1代表其模型的性能越好。 R 2 计算公式以下:

R 2 = 1 1 n i = 1 n ( y i y ^ i ) 2 1 n i = 1 n ( y i μ i ) 2 = 1 M S E v a r ( y )

from sklearn.metrics import r2_score
print("train r2:%.3f"%r2_score(train_y,train_y_pred))
#train r2:0.473
print("test r2:%.3f"%r2_score(test_y,test_y_pred))
#test r2:0.485

线性回归优缺点

优势

  • 能够快速建模,特别适用于所要建模的关系不是特别复杂而且数据量不大。
  • 线性回归简单且易于理解,有利于商业决策。

缺点

  • 对于非线性数据进行多项式回归设计可能比较困难,由于必须具备特征变量之间关系和数据结构的一些信息。
  • 因为上述缘由,当涉及到数据复杂度较高时,这些模型的性能不如其余模型。

Generalized Linear Models ( 广义线性模型 )

来源:apache官网中文翻译
介绍sklearn中的广义线性模型。
在整个模块中,咱们指定coef_表明向量 w = ( w 1 , , w p ) , intercept_表明 w 0

Ordinary Least Squares ( 普通最小二乘法 )

LinearRegression类的成员函数 fit 以数组X和y为输入,并将线性模型的系数 w 存储在其成员变量coef_中:

>>> from sklearn import linear_model
>>> reg = linear_model.LinearRegression()
>>> reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
>>> reg.coef_
array([ 0.5,  0.5])

然而,最小二乘的系数估计依赖于模型特征项的独立性。当特征项相关而且设计矩阵X 的列近似的线性相关时,设计矩阵便接近于一个奇异矩阵,所以最小二乘估计对观测点中的随机偏差变得高度敏感,产生大的方差。例如,当没有试验设计的收集数据时,可能会出现这种多重共线性(multicollinearity )的状况。
Ordinary Least Squares Complexity ( 普通最小二乘法复杂度 )
该方法经过对X进行 singular value decomposition ( 奇异值分解 ) 来计算最小二乘法的解。若是 X 是大小为(n, p) 的矩阵,则该方法的复杂度为o(np^2) ,假设 n p

Ridge Regression ( 岭回归 )

岭回归经过对系数的大小施加惩罚来解决普通最小二乘的一些问题。 ridge coefficients ( 岭系数 ) 最小化一个带罚项(就是咱们所说的正则项)的残差平方和,

m i n w | | w T X y | | 2 2 + α | | w | | 2 2

这里, α 0 是控制回归系数的复杂度参数: 值越大,回归系数越均匀,越存在过拟合的可能;值越大,回归系数越简单,就量更多的系数接近0,泛化能力更强,所以系数变得对共线性变得更加鲁棒,但拟合可能没那么好。

与其余线性模型同样,Ridge 类成员函数 fit 以数组X和y为输入,并将线性模型的系数 w 存储在其成员变量coef_ 中:

>>> from sklearn import linear_model
>>> reg = linear_model.Ridge (alpha = .5)
>>> reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,
      normalize=False, random_state=None, solver='auto', tol=0.001)
>>> reg.coef_
array([ 0.34545455,  0.34545455])
>>> reg.intercept_
0.13636...

Ridge Complexity ( 岭复杂性 )
这种方法与 Ordinary Least Squares ( 普通最小二乘方法 ) 的复杂度相同。
Setting the regularization parameter: generalized Cross-Validation ( 设置正则化参数:广义交叉验证 )

>>> from sklearn import linear_model
>>> reg = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0])
>>> reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])      
RidgeCV(alphas=[0.1, 1.0, 10.0], cv=None, fit_intercept=True, scoring=None,
    normalize=False)
>>> reg.alpha_                                     
0.1

Lasso

Lasso 是估计稀疏系数的线性模型。它在一些状况下是有用的,由于它倾向于使用具备较少回归系数的解决方案,有效地减小给定解决方案所依赖的变量的数量。为此,Lasso 及其变体是 compressed sensing ( 压缩感测领域 ) 的基础。在某些条件下,它能够恢复精确的非零权重集(参见 Compressive sensing: tomography reconstruction with L1 prior (Lasso) ( 压缩感测:使用 L1 先验( Lasso )进行断层扫描重建 ) )。

在数学上,它由一个使用 L 1 先验做为正则化项的线性模型组成。最小化的目标函数是:

m i n s 1 2 n s a m p l e | | w T x y | | 2 2 + α | | w | | 1

所以,lasso estimate 解决了加上罚项 α | | w | | 1 的最小二乘法的最小化,其中, α 是常数, | | w | | 1 是回归系数的 L 1 范数,即回归系数各元素的绝对值之和。
Lasso 类中的实现使用坐标降低做为算法来拟合系数。查看 Least Angle Regression ( 最小角度回归 ) 用于另外一个实现:

>>> from sklearn import linear_model
>>> reg = linear_model.Lasso(alpha = 0.1)
>>> reg.fit([[0, 0], [1, 1]], [0, 1])
Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
>>> reg.predict([[1, 1]])
array([ 0.8])

对于较低级别的任务也颇有用的是函数 lasso_path 来计算可能值的完整路径上的系数。

注意

  • Feature selection with Lasso ( 功能套索和弹性网 )
    因为 Lasso 回归生成稀疏模型,所以能够用于实现特征选择,如 L1-based feature selection ( 基于 L1 的特征选择 ) 中所详述的。

注意

  • Randomized sparsity ( 随机稀释 )
    对于特征选择或稀疏恢复,使用 Randomized sparse models ( 随机稀疏模型 ) 可能颇有趣。

Setting regularization parameter ( 设置正则化参数 )
alpha 参数控制 degree of sparsity of the coefficients estimated ( 估计的系数的稀疏度 ) 。
Using cross-validation ( 使用交叉验证 )

scikit-learn 经过交叉验证来公开设置 Lasso alpha 参数的对象:LassoCV 和 LassoLarsCV 。 LassoLarsCV 是基于下面解释的 Least Angle Regression ( 最小角度回归 ) 算法。
对于具备许多共线回归的高维数据集, LassoCV 最多见。然而, LassoLarsCV 具备探索更相关的 alpha 参数值的优势,而且若是样本数量与观察次数相比很是小,则一般比 LassoCV 快。



Information-criteria based model selection ( 基于信息标准的模型选择 )
估计器 LassoLarsIC 建议使用 Akaike 信息准则(AIC)和贝叶斯信息准则(BIC)。当使用 k-fold 交叉验证时,正则化路径只计算一次而不是 k + 1 次,因此找到 α 的最优值是一个计算上更便宜的替代方法。然而,这样的标准须要对解决方案的自由度进行适当的估计,为大样本(渐近结果)导出,并假设模型是正确的,即数据其实是由该模型生成的。当问题条件差时,它们也倾向于打破(比样本更多的特征)。

Multi-task Lasso ( 多任务套索 )

MultiTaskLasso 是一个线性模型,它联合估计多个回归问题的稀疏系数:y 是一个二维数组,shape(n_samples,n_tasks)。约束是所选的特征对于全部的回归问题都是相同的,也称为 tasks ( 任务 )。
下图比较了使用简单 Lasso 或 MultiTaskLasso 得到的 W 中非零的位置。 Lasso 估计产生分散的非零,而 MultiTaskLasso 的非零是全列。


在数学上,它由一个线性模型组成,训练有混合的 L 1 , L 2 以前的正则化。目标函数最小化是:

m i n s 1 2 n s a m p l e | | w T x y | | F r o 2 + α | | w | | 21

其中 Fro表示 Frobenius 规范:
| | A | | F r o = i j a i j 2

L 1 , L 2 混合形式以下:
| | A | | 21 = i j a i j 2

MultiTaskLasso 类中的实现使用坐标降低做为拟合系数的算法。

Elastic Net ( 弹性网 )

ElasticNet 是一种线性回归模型,以 L1 和 L2 组合为正则化项。这种组合容许学习一个稀疏模型,其中不多的权重是非零的,如 Lasso ,同时仍然保持 Ridge 的正则化属性。咱们使用 l1_ratio 参数控制 L1 和 L2 的凸组合。
当有多个相互关联的特征时,Elastic-net 是有用的。 Lasso 有可能随机选择其中之一,而 elastic-net 则极可能选择二者。

Lasso 和 Ridge 之间的一个实际的优点是容许 Elastic-Net 继承 Ridge 在一些旋转下的稳定性。
在这种状况下,最小化的目标函数

m i n s 1 2 n s a m p l e | | w T x y | | 2 2 + α ρ | | w | | 1 + α ( 1 ρ ) 2 | | w | | 2 2


ElasticNetCV 类可用于经过交叉验证来设置参数 alpha( α )和 l1_ratio ( ρ )

Multi-task Elastic Net ( 多任务弹性网 )

MultiTaskElasticNet 是一个弹性网络模型,能够联合估计多个回归问题的稀疏系数: Y 是 2D array,shape(n_samples, n_tasks)。constraint ( 约束 ) 是所选的特征对于全部的回归问题都是相同的,也称为 tasks ( 任务 )。
目标函数最小化是:

m i n s 1 2 n s a m p l e | | w T x y | | F r o 2 + α ρ | | w | | 21 + α ( 1 ρ ) 2 | | w | | F r o 2

MultiTaskElasticNet 类中的实现使用坐标降低做为拟合系数的算法。
MultiTaskElasticNetCV 类可用于经过交叉验证来设置参数 alpha( α ) 和l1_ratio( ρ )。

Least Angle Regression ( 最小角度回归 )

Least-angle regression ( 最小二乘回归 ) ( LARS ) 是由 Bradley Efron,Trevor Hastie,Iain Johnstone 和 Robert Tibshirani 开发的高维数据回归算法。
LARS 的优势是:

  • p >> n 的状况下(即,当维数显著大于点数时)的数值效率较高
  • 它在计算上与正向选择同样快,而且具备与普通最小二乘法相同的复杂度。
  • 它产生一个完整的分段线性解决路径,这在交叉验证或相似的调试模型尝试中颇有用。
  • 若是两个变量与响应几乎相等,那么它们的系数应该以大体相同的速率增长。所以,算法的行为就像直觉所指望的那样,而且也更稳定。
  • 它很容易被修改成其余估计器产生解决方案,如 Lasso 。

LARS 方法的缺点包括:

  • 由于 LARS 是基于对残差进行迭代从新设计的,因此它彷佛对噪声的影响特别敏感。 Weisberg 在 Efron 等人的讨论部分详细讨论了这个问题。 (2004) Annals of Statistics article 。

LARS 模型可使用估计器 Lars 或其低级实现 lars_path 来使用。

LARS Lasso

LassoLars 是使用 LARS 算法实现的 lasso model ( 套索模型 ) ,与基于 coordinate_descent 的实现不一样,这产生了精确的解,其做为其系数范数的函数是分段线性的。

>>> from sklearn import linear_model
>>> reg = linear_model.LassoLars(alpha=.1)
>>> reg.fit([[0, 0], [1, 1]], [0, 1]) 
LassoLars(alpha=0.1, copy_X=True, eps=..., fit_intercept=True,
     fit_path=True, max_iter=500, normalize=True, positive=False,
     precompute='auto', verbose=False)
>>> reg.coef_   
array([ 0.717157...,  0.        ])

Lars 算法提供了沿着正则化参数的系数的完整路径,几乎是免费的,所以一个常见的操做包括使用函数 lars_path 检索路径。
Mathematical formulation ( 数学表达 )

该算法相似于 forward stepwise regression ( 前向逐步回归 ) ,而不是在每一个步骤中包含变量,估计参数在等于每一个与残差相关的方向上增长。
代替给出向量结果,LARS 解决方案由表示参数向量的 L1 norm ( 范数 ) 的每一个值的解的曲线组成。完整系数路径存储在具备 size(n_features, max_features + 1) 的数组 coef_path_ 中。第一列始终为零。

Orthogonal Matching Pursuit (OMP) ( 正交匹配追踪(OMP) )

OrthogonalMatchingPursuit ( 正交匹配追踪 ) 和 orthogonal_mp 实现了 OMP 算法,用于近似线性模型的拟合,并对非零系数(即 L 0 伪范数)施加约束。
做为 Least Angle Regression ( 最小角度回归 ) 的前向特征选择方法,正交匹配追踪能够用固定数量的非零元素逼近最优解矢量:

a r g   m i n | | y X γ | | 2 2   s u b j e c t   t o   | | γ | | 0 n n o n e z e r o c o e f s

或者,正交匹配追踪能够针对特定错误而不是特定数量的非零系数。这能够表示为:
a r g   m i n | | γ | | 0   s u b j e c t   t o   | | y X γ | | 2 2 t o l

OMP 基于一个贪心算法,每一个步骤都包含与当前残差最相关的原子。它相似于更简单的匹配追求( MP )方法,可是在每次迭代中更好,使用在先前选择的词典元素的空间上的正交投影从新计算残差。
OMP 基于一个贪心算法,每一个步骤都包含与当前残差最相关的原子。它相似于更简单的匹配追求( MP )方法,可是在每次迭代中更好,使用在先前选择的词典元素的空间上的正交投影从新计算残差。

Bayesian Regression ( 贝叶斯回归 )

贝叶斯回归技术能够用于在估计过程当中包括正则化参数:正则化参数不是硬的设置,而是调整到手头的数据。
这能够经过对模型的超参数引入 uninformative priors ( 不知情的先验 ) 来完成。Ridge Regression 中使用的 L 2 正则化等价于在精度为 的参数 w 以前,在高斯下找到最大 a-postiori 解。而不是手动设置 lambda ,能够将其视为从数据估计的随机变量。
为了得到一个彻底几率模型,输出y被假定为高斯分布在 X w 周围:

p ( y | X , w , α ) = N ( y | X w , α )

Alpha 再次被视为从数据估计的随机变量。
贝叶斯回归的优势是:

  • 它适应了 data at hand ( 手头的数据 ) 。
  • 它能够用于在估计过程当中包括正则化参数。

贝叶斯回归的缺点包括:

  • 模型的推论多是耗时的。

Bayesian Ridge Regression ( 贝叶斯岭回归 )

BayesianRidge estimates ( 贝叶斯岭方差估计 ) 如上所述的回归问题的几率模型。参数 w 的先验由球面高斯给出:

p ( w | λ ) = N ( w | 0 , λ 1 I )

选择 α λ 的先验是 gamma distributions ( 伽马分布 ) ,即 conjugate prior for the precision of the Gaussian ( 高斯精度以前的共轭 ) 。
所获得的模型称为 Bayesian Ridge Regression ( 贝叶斯岭回归 ) ,与 classical Ridge ( 古典岭 ) 类似。参数 w α λ 在模型拟合期间联合估计。剩余的超参数是 α λ 以后的伽玛先验的参数。这些一般被选为 non-informative ( 非资料性 ) 的。经过最大化边际对数似然估计参数。
默认状况下,

贝叶斯回归用于回归:

>>> from sklearn import linear_model
>>> X = [[0., 0.], [1., 1.], [2., 2.], [3., 3.]]
>>> Y = [0., 1., 2., 3.]
>>> reg = linear_model.BayesianRidge()
>>> reg.fit(X, Y)
BayesianRidge(alpha_1=1e-06, alpha_2=1e-06, compute_score=False, copy_X=True,
       fit_intercept=True, lambda_1=1e-06, lambda_2=1e-06, n_iter=300,
       normalize=False, tol=0.001, verbose=False)

安装后,该模型可用于预测新值:

>>> reg.predict ([[1, 0.]])
array([ 0.50000013])

模型的权重 w 能够访问:

>>> reg.coef_
array([ 0.49999993, 0.49999993])

因为贝叶斯框架发现的权重与普通最小二乘法发现的权重略有不一样。然而,贝叶斯岭回归对于不适当的问题更为强大。

Automatic Relevance Determination - ARD ( 自动相关性测定 - ARD )

ARDRegression 与 Bayesian Ridge Regression ( 贝叶斯岭回归 ) 很是类似,但能够致使更稀疏的权重 w 。 ARDREgression 经过放弃高斯为球面的假设,构成了与 w 以前不一样的先验。
相反,假定 w 上的分布是轴平行的椭圆高斯分布。
这意味着每一个权重 w i 从高斯分布绘制,以零为中心,精度为 λ i

p ( w | λ ) = N ( w | 0 , A 1 )

d i a g ( A ) = λ = { λ 1 , , λ p }
与贝叶斯岭回归相反,每一个 w i 的坐标都有本身的标准误差 λ i 。 先前的全部 λ i 被选择为由超参数 λ 1 λ 2 给出的相同的伽马分布。

ARD 在文献中也被称为稀疏贝叶斯学习与 Relevance Vector Machine

Logistic regression ( 逻辑回归 )

Logistic regression ( 逻辑回归 ) ,尽管它的名字是回归,是一个用于分类的线性模型而不是用于回归。

Stochastic Gradient Descent - SGD ( 随机梯度降低 )

Stochastic gradient descent ( 随机梯度降低 ) 是一种简单但很是有效的拟合线性模型的方法。当 samples ( 样本 ) 数量(和 features ( 特征 ) 数量)很是大时,这是特别有用的。 partial_fit 方法 only/out-of-core 学习。
SGDClassifier 和 SGDRegressor 类提供了使用不一样(凸)损失函数和不一样惩罚的分类和回归的线性模型的功能。例如,当 loss=“log” 时,SGDC 分类器适合逻辑回归模型,而 loss=”hinge” 则适合线性支持向量机( SVM )。

Perceptron ( 感知 )

Perceptron ( 感知器 ) 是适用于大规模学习的另外一种简单算法。默认:

  • 它不须要 learning rate ( 学习率 ) 。
  • 它不是 regularized (penalized) ( 正规化(惩罚) ) 。
  • 它 updates its model only on mistakes ( 仅在错误时更新其模型 ) 。

最后一个特征意味着 Perceptron ( 感知器 ) 比 hinge loss 比 SGD 稍快一点,而且所获得的模型更加 sparser ( 稀疏 ) 。

Passive Aggressive Algorithms ( 被动侵略性算法 )

passive-aggressive algorithms ( 被动侵略算法 ) 是用于 large-scale learning ( 大规模学习 ) 的一系列算法。它们与 Perceptron ( 感知器 ) 相似,由于它们不须要 learning rate ( 学习率 ) 。然而,与 Perceptron ( 感知器 ) 相反,它们包括正则化参数 C 。
对于分类,PassiveAggressiveClassifier 能够与 loss =’hinge’ ( PA-I )或 loss =“squared_hinge” ( PA-II )一块儿使用。对于回归,PassiveAggressiveRegressor 能够与 loss =’epsilon_insensitive’ ( PA-I )或 loss =’squared_epsilon_insensitive’ ( PA-II )一块儿使用。

Robustness regression: outliers and modeling errors ( 鲁棒性回归:异常值和建模偏差 )

Robust regression ( 鲁棒性回归 ) 有兴趣在存在 presence of corrupt data ( 腐败数据 ) 的状况下拟合回归模型:outliers ( 异常值 ) 或模型中的错误。

Different scenario and useful concepts ( 不一样的场景和有用的概念 )

处理由异常值损坏的数据时,请记住不一样的事项:
Outliers in X or in y?


Outliers in the y direction


Outliers in the X direction

Fraction of outliers versus amplitude of error ( 异常值与偏差幅度的分数 )
The number of outlying points matters, but also how much they are outliers. ( 离岸点的数量很重要,但也是离群点多少 )


Small outliers


Large outliers

robust fitting 的一个重要概念就是 breakdown point ( 分解点 ) :能够离开的数据的分数,以适合开始丢失内部数据。

注意,通常来讲,在高维度设置(大 n_features )中的 robust fitting ( 鲁棒拟合 ) 是很是困难的。这里的 robust models ( 健壮模型 ) 可能没法在这些设置中使用。

RANSAC: RANdom SAmple Consensus

RANSAC ( RANdom SAmple Consensus ) 适合来自完整数据集的来自随机子集的模型。
RANSAC 是一种 non-deterministic ( 非肯定性 ) 算法,只产生具备必定几率的合理结果,这取决于迭代次数(参见 max_trials 参数)。它一般用于线性和非线性回归问题,在摄影测量计算机视觉领域尤为受欢迎。
该算法将完整的输入采样数据分解为可能受到噪声的一组内联集,以及异常值。由数据的错误测量或无效假设引发。而后,所获得的模型仅来自肯定的内部估计。

Details of the algorithm ( 算法的细节 )
每次迭代执行如下步骤:

  • 从原始数据中选择 min_samples random samples ( 随机样本 ) ,并检查数据集是否有效(请参阅 is_data_valid)。
  • 将模型拟合为 random subset ( 随机子集 ) ( base_estimator.fit ),并检查估计模型是否有效(请参阅 is_model_valid )。
  • 经过计算 estimated model ( 估计模型 ) 的残差(base_estimator.predict(X) - y))将全部数据做为内部值或异常值进行分类 - all 绝对残差小于 residual_threshold ( 残差阈值 ) 的数据样本均被视为内部值。
  • 若是 Inlier 样本数量最大,则将拟合模型保存为最佳模型。若是当前估计的模型具备相同数量的内部值,则只有当其具备较好的分数时才被认为是最佳模型。

这些步骤最大次数( max_trials )执行,或直到知足特殊中止条件之一(参见 stop_n_inliers 和 stop_score )。最终模型使用先前肯定的最佳模型的全部 Inlier 样本(一致集合)进行估计。

is_data_valid 和 is_model_valid 函数容许识别和拒绝随机子样本的退化组合。若是估计的模型不须要用于识别退化状况,则应使用 is_data_valid ,由于它在拟合模型以前被调用,从而致使更好的计算性能。

Theil-Sen estimator: generalized-median-based estimator ( Theil-Sen 估计:广义中位数估计 )

TheilSenRegressor 估计器使用 generalization of the median in multiple dimensions ( 多维度中值的泛化 ) 。所以,多变量离群值是很是 robust ( 鲁棒 ) 的。可是请注意,估计器的鲁棒性随着问题的维数而迅速下降。它失去了其鲁棒性,而且在高维度上变得不如普通的最小二乘法。
Theoretical considerations ( 理论考虑 )
TheilSenRegressor 在渐近效率方面与普通最小二乘法( OLS )至关,做为无偏估计。与 OLS 相反,Theil-Sen 是一种非参数方法,这意味着它不会对数据的基本分布作出假设。因为 Theil-Sen 是一个基于中位数的估计器,它对于破坏的数据而言更为强大。在单变量设置中,Theil-Sen 在简单线性回归的状况下的崩溃点约为 29.3% ,这意味着它能够容忍高达 29.3% 的任意损坏的数据。

在 scikit-learn 中 TheilSenRegressor 的实现遵循多变量线性回归模型 的推广,使用空间中值,这是中位数到多维度的推广]。
在时间和空间复杂性方面, Theil-Sen scales 根据:

( n s a m p l e s n s u b s a m p l e s )

这使得对于大量样品和特征的问题进行完全的应用是不可行的。所以,能够经过仅考虑全部可能组合的随机子集来选择子群体的大小来限制时间和空间复杂性。

Huber Regression ( 胡伯回归 )

HuberRegressor 与 Ridge 不一样,由于它将线性损失应用于被分类为异常值的样本。若是该样本的绝对偏差小于某一阈值,则样本被归类为一个异常值。它不一样于 TheilSenRegressor 和 RANSACRegressor ,由于它不会忽视异常值的影响,但对它们的重视程度较小。

Polynomial regression: extending linear models with basis functions ( 多项式回归:用基函数扩展线性模型 )

机器学习中的一种常见模式是使用训练数据非线性函数的线性模型。这种方法保持线性方法的 generally fast performance ( 通常快速性能 ) ,同时容许它们适应更普遍的数据。
例如,能够经过从 constructing polynomial features ( 系数构造多项式特征 ) 来扩展简单的线性回归。在标准线性回归的状况下,您可能有一个相似于二维数据的模型:

y ^ ( w , x ) = w 0 + w 1 x 1 + w 2 x 2

若是咱们想要将数学拟合为抛物面而不是平面,咱们能够将 second-order polynomials ( 二阶多项式 ) 的特征组合起来,使得模型以下所示:
y ^ ( w , x ) = w 0 + w 1 x 1 + w 2 x 2 + w 3 x 1 x 2 + w 4 x 1 2 + w 5 x 2 2

(有时使人惊讶)的观察是,这仍然是一个线性模型:要看到这一点,想象一下建立一个新的变量
z = [ x 1 , x 2 , x 1 x 2 , x 1 2 , x 2 2 ]

经过对数据的从新标注,能够写出咱们的问题
y ^ ( w , x ) = w 0 + w 1 z 1 + w 2 z 2 + w 3 z 3 + w 4 z 4 + w 5 z 5

咱们看到所获得的多项式回归与上面咱们考虑过的线性模型相同(即模型在 w 中是线性的),而且能够经过相同的技术来解决。经过考虑使用这些基本功能构建的更高维度空间内的线性拟合,该模型具备适应更普遍范围的数据的灵活性。

如下是使用不一样程度的多项式特征将这一想法应用于一维数据的示例:

该图是使用 PolynomialFeatures 预处理器建立的。该预处理器将输入数据矩阵转换为给定度的新数据矩阵。它可使用以下:

>>> from sklearn.preprocessing import PolynomialFeatures
>>> import numpy as np
>>> X = np.arange(6).reshape(3, 2)
>>> X
array([[0, 1], [2, 3], [4, 5]])
>>> poly = PolynomialFeatures(degree=2)
>>> poly.fit_transform(X)
array([[ 1., 0., 1., 0., 0., 1.], [ 1., 2., 3., 4., 6., 9.], [ 1., 4., 5., 16., 20., 25.]])

X 的特征已经从 [ x 1 , x 2 ] 转换为 [ 1 , x 1 , x 2 , x 1 2 , x 1 x 2 , x 2 2 ] ,如今能够在任何线性模型中使用。
这种预处理可使用 Pipeline 进行简化。能够建立表示简单多项式回归的单个对象,并使用以下:

>>> from sklearn.preprocessing import PolynomialFeatures
>>> from sklearn.linear_model import LinearRegression
>>> from sklearn.pipeline import Pipeline
>>> import numpy as np
>>> model = Pipeline([('poly', PolynomialFeatures(degree=3)),
...                   ('linear', LinearRegression(fit_intercept=False))])
>>> # fit to an order-3 polynomial data
>>> x = np.arange(5)
>>> y = 3 - 2 * x + x ** 2 - x ** 3
>>> model = model.fit(x[:, np.newaxis], y)
>>> model.named_steps['linear'].coef_
array([ 3., -2.,  1., -1.])

训练多项式特征的线性模型可以准确地恢复输入多项式系数。
在某些状况下,没有必要包含任何单个功能的更高的功能,而只包含全部交互功能,这些功能能够在多达 d 个不一样的功能中进行叠加。这些能够经过设置 interaction_only = True 从 PolynomialFeatures 得到。
例如,当处理布尔特征时,全部 n 的 x i n = x i 所以是无用的;但 x i x j 表示两个布尔值的链接。这样,咱们可使用线性分类器来解决 XOR 问题:

>>> from sklearn.linear_model import Perceptron
>>> from sklearn.preprocessing import PolynomialFeatures
>>> import numpy as np
>>> X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
>>> y = X[:, 0] ^ X[:, 1]
>>> y
array([0, 1, 1, 0])
>>> X = PolynomialFeatures(interaction_only=True).fit_transform(X).astype(int)
>>> X
array([[1, 0, 0, 0], [1, 0, 1, 0], [1, 1, 0, 0], [1, 1, 1, 1]])
>>> clf = Perceptron(fit_intercept=False, n_iter=10, shuffle=False).fit(X, y)

And the classifier “predictions” are perfect: ( 分类器“预测”是完美的 ) :

>>> clf.predict(X)
array([0, 1, 1, 0]) >>> clf.score(X, y) 1.0

最小二乘法多项式曲线拟合

多项式曲线拟合与多元线性回归拟合不一样点在于,多元线性回归自变量有多个,因变量是多个自变量的线性组合,其形式为 y = w 0 + w 1 x 1 + + w n x n ;而多项式拟合自变量仍是一个,只不过因变量能够看做是自变量不一样多项式的线性组合,其形式为 y = w 0 + w 1 x + w 2 x 2 + + w k x k 。但利用矩阵计算时,若是满秩,二者系数的表达方式是同样的, w = ( X T X ) 1 X T Y

概念

默认地认为因变量是自变量的多项式的线性组全,即有以下形式 y = w 0 + w 1 x + w 2 x 2 + + w k x k 。最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地通过这些点,而是拟合曲线 y = ϕ ( x ) 上的数据点到原数据点的偏差平方和最小。即有

m i n ϕ i = 1 m δ i 2 = m i n ϕ i = 1 m ( ϕ ( x i ) y i ) 2 = m i n ϕ i = 1 m ( w 0 + w 1 x i + w 2 x i 2 + + w k x i k y i ) 2 ( 1 )

回归系数求解

求最值问题,若是直接求解那么必然在可能的极值点得到(此时没有边界限制)。
对(1)式求偏导,以下

i = 1 m 2 ( w 0 + w 1 x i + w 2 x i 2 + + w k x i k y i ) ( w 0 + w 1 x i + w 2 x i 2 + + w k x i k ) w = 0

为便于理解,咱们每次都只对w的一个维度求偏导,则有
相关文章
相关标签/搜索