线性回归,又称普通最小二乘法(Ordinary Least Squares, OLS),是回归问题最简单也最经典的线性方法。线性回归需按照参数 w 和 b,使得对训练集的预测值与真实的回归目标值 y 之间的均方误差(MSE)最小。
均方误差(Mean Squared Error)是预测值与真实值之差的平方和除以样本数。
线性回归没有参数,这是一个优点,但也因此无法控制模型的复杂度。
1.1 基本形式
线性回归预测模型:
(1) f ( x ) = w 1 x 1 + w 2 x 2 + ⋅ ⋅ ⋅ + w n x n + b f(x)=w_1 x_1 + w_2 x_2 + \cdot \cdot \cdot + w_n x_n + b \tag{1} f(x)=w1x1+w2x2+⋅⋅⋅+wnxn+b(1)
f ( x ) f(x) f(x) 是预测值
n n n 是特征的数量
x i x_i xi 是第 i i i 个特征值
偏置项 b b b 以及特征权重 w 1 , w 2 , ⋅ ⋅ ⋅ , w n w_1, w_2,\cdot \cdot \cdot ,w_n w1,w2,⋅⋅⋅,wn
这可以用更为简介的向量化表示。
线性回归预测模型(向量化):
(2) f ( x ) = w T ⋅ x + b = θ T ⋅ x \begin{aligned} f(x) &= w^T \cdot x + b \\ &= \theta^T \cdot x \\ \end{aligned}\tag{2} f(x)=wT⋅x+b=θT⋅x(2)
w = ( w 1 ; w 2 ; . . . ; w n ) w=(w_1;w_2;...;w_n) w=(w1;w2;...;wn)
关于 w w w 的计算,有两种方法,一种是利用最小二乘法最小化 MSE 导出 w w w 的计算公式(标准方程);另一种是利用梯度下降法找出 MSE 的最小值。
首先来看最小利用最小二乘法计算 w w w 的公式。
利用最小二乘法最小化成本函数 ,可以得出 θ \theta θ 的计算方程(标准方程):[1]
(3) θ ^ = ( X T ⋅ X ) ( − 1 ) ⋅ X T ⋅ y \hat{\theta} = (X^T \cdot X)^{(-1)} \cdot X^T \cdot y \tag{3} θ^=(XT⋅X)(−1)⋅XT⋅y(3)
θ ^ \hat{\theta} θ^ 是使成本函数 MSE 最小化的 θ \theta θ 值
y y y 是包含 y ( 1 ) y^{(1)} y(1) 到 y ( m ) y^{(m)} y(m) 的目标值向量
则最终学得的多元线性回归模型为:
(4) f ( x ˉ i ) = x ˉ i ⋅ θ T = x ˉ i ⋅ ( X T X ) − 1 X T y \begin{aligned} f(\bar{x}_i) &= \bar{x}_i \cdot \theta^T \\ &= \bar{x}_i\cdot(X^TX)^{-1}X^Ty\\ \end{aligned}\tag{4} f(xˉi)=xˉi⋅θT=xˉi⋅(XTX)−1XTy(4)
其中: x ˉ i = ( x i ; 1 ) \bar{x}_i=(x_i;1) xˉi=(xi;1)。
推导过程如下:
2.1 标准方程法
2.1.1 普通形式
标准方程法,又称标准最小二乘法,即通过最小二乘法求出 w w w 和 b b b 或向量形式下的 θ \theta θ,由最小二乘法导出的 θ \theta θ 计算公式称为标准方程。
首先来推导普通形式下 w w w 和 b b b 的计算公式。
线性回归试图学得:
(5) f ( x i ) = w x i + b , 使 得 f ( x i ) ≃ y i f(x_i)=wx_i+b, 使得 f(x_i)\simeq y_i \tag{5} f(xi)=wxi+b,使得f(xi)≃yi(5)
如何确定 w w w 和 b b b 呢?关键在于如何衡量 f ( x ) f(x) f(x) 与 y y y 之间的差别。
回想一下,训练模型就是设置模型参数知道模型最适应训练集的过程。要达到这个目的,我们首先需要知道怎么衡量模型对训练数据的拟合程度是好还是差,在 机器学习 | 回归评估指标 里,我们了解到回归模型最常见的性能指标有均方误差(MSE)。因此以 MSE 为线性回归模型的成本函数,在训练线性回归模型时,我们需要找到最小化 MSE 的 w w w 值 w ∗ w^* w∗,即:
(6) ( w ∗ , b ∗ ) = arg min ( w , b ) ∑ i = 1 m ( f ( x i ) − y i ) 2 = arg min ( w , b ) ∑ i = 1 m ( y i − w x i − b ) 2 \begin{aligned} (w^*,b^*) &= \mathop{\arg\min}\limits_{(w,b)}\sum_{i=1}^m(f(x_i)-y_i)^2 \\ &= \mathop{\arg\min}\limits_{(w,b)}\sum_{i=1}^m(y_i-wx_i-b)^2 \\ \end{aligned} \tag{6} (w∗,b∗)=(w,b)argmini=1∑m(f(xi)−yi)2=(w,b)argmini=1∑m(yi−wxi−b)2(6)
求解 w w w 和 b b b 使得 E ( w , b ) = ∑ i = 1 m ( y i − w x i − b ) 2 E_{(w,b)}=\sum_{i=1}^m(y_i-wx_i-b)^2 E(w,b)=∑i=1m(yi−wxi−b)2 最小化的过程,称为线性回归模型的最小二乘“参数估计”(parameter estimation),我们可以将 E ( w , b ) E_{(w,b)} E(w,b) 分别对 w w w 和 b b b 求偏导,得到:[2]
(7) ∂ E ( w , b ) ∂ w = 2 ( w ∑ i = 1 m x i 2 − ∑ i = 1 m ( y i − b ) x i ) \frac{\partial E_{(w,b)}}{\partial w} = 2\bigg(w\sum_{i=1}^m x_i^2 - \sum_{i=1}^m(y_i-b)x_i \bigg) \tag{7} ∂w∂E(w,b)=2(wi=1∑mxi2−i=1∑m(yi−b)xi)(7) (9) ∂ E ( w , b ) ∂ b = 2 ( m b − ∑ i = 1 m ( y i − w x i ) ) \frac{\partial E_{(w,b)}}{\partial b} = 2\bigg(mb - \sum_{i=1}^m(y_i-wx_i)\bigg) \tag{9} ∂b∂E(w,b)=2(mb−i=1∑m(yi−wxi))(9)
然后令公式 (8)、(9) 为零可以得到 w w w 和 b b b 最优解的闭式(closed-form)解:
(10) w = ∑ i = 1 m y i ( x i − x ˉ ) ∑ i = 1 m x i 2 − 1 m ( ∑ i = 1 m x i ) 2 w = \frac{\sum_{i=1}^my_i(x_i-\bar{x})}{\sum_{i=1}^mx_i^2 - \frac{1}{m}\big(\sum_{i=1}^m x^i\big)^2} \tag{10} w=∑i=1mxi2−m1(∑i=1mxi)2∑i=1myi(xi−xˉ)(10) (11) b = 1 m ∑ i = 1 m ( y i − w x i ) b = \frac{1}{m}\sum_{i=1}^m(y_i-wx_i) \tag{11} b=m1i=1∑m(yi−wxi)(11)
2.1.2 向量形式
更一般的情形是对如有 n n n 个属性的数据集 D D D ,这时我们试图学得:
(12) f ( x i ) = w T x i + b , 使 得 f ( x i ) ≃ y i f(x_i)=w^Tx_i+b, 使得 f(x_i)\simeq y_i \tag{12} f(xi)=wTxi+b,使得f(xi)≃yi(12)
这称为多元线性回归(multivariate linear regression).
类似的,可利用最小二乘法对 w w w 和 b b b 进行估计。为便于讨论,我们吧 w w w 和 b b b 转换为向量形式 θ = ( w ; b ) \theta = (w;b) θ=(w;b),即:
(13) f ( x i ) = w T ⋅ x i + b = θ T ⋅ x i \begin{aligned} f(x_i) &= w^T \cdot x_i + b \\ &= \theta^T \cdot x_i \\ \end{aligned}\tag{13} f(xi)=wT⋅xi+b=θT⋅xi(13)
相应的,把数据集 D D D 表示为一个 m × ( d + 1 ) m \times (d+1) m×(d+1) 大小的矩阵 X X X,其中每行对应与一个示例,该行前 d d d 个元素对应与示例的 d d d 个属性值,最后一个元素恒为 1,即:
(14) X = ( x 11 x 12 ⋯ x 1 n 1 x 21 x 22 ⋯ x 2 n 1 ⋮ ⋮ ⋱ ⋮ ⋮ x m 1 x m 2 ⋯ x m n 1 ) = ( x 1 n T 1 x 2 n T 1 ⋮ ⋮ x m T 1 ) X = \left( \begin{array}{cc} x_{11} & x_{12} & \cdots& x_{1n} & 1\\ x_{21} & x_{22} & \cdots\ & x_{2n} & 1\\ \vdots & \vdots & \ddots\ & \vdots & \vdots\\ x_{m1} & x_{m2} & \cdots& x_{mn} & 1\\ \end{array} \right) =\left( \begin{array}{cc} x_{1n}^T & 1\\ x_{2n}^T & 1\\ \vdots & \vdots\\ x_{m}^T & 1\\ \end{array} \right)\tag{14} X=⎝⎜⎜⎜⎛x11x21⋮xm1x12x22⋮xm2⋯⋯⋱⋯x1nx2n⋮xmn11⋮1⎠⎟⎟⎟⎞=⎝⎜⎜⎜⎛x1nTx2nT⋮xmT11⋮1⎠⎟⎟⎟⎞(14)
再把标记也写成向量形式 y = ( y 1 ; y 2 ; ⋯   ; y m ) y=(y_1;y_2;\cdots;y_m) y=(y1;y2;⋯;ym),类似于公式 (7) ,有:
(15) θ ^ = arg min θ ( y − X θ ) T ( y − X θ ) \hat{\theta} = \mathop{\arg\min}\limits_{\theta}(y-X\theta)^T(y-X\theta)\tag{15} θ^=θargmin(y−Xθ)T(y−Xθ)(15)
令 E θ = ( y − X θ ) T ( y − X θ ) E_{\theta}=(y-X\theta)^T(y-X\theta) Eθ=(y−Xθ)T(y−Xθ) ,对 θ \theta θ 求导得到:
(16) d E θ d θ = 2 X T ( X θ − y ) \frac{dE_{\theta}}{d\theta}=2X^T(X\theta-y)\tag{16} dθdEθ=2XT(Xθ−y)(16)
当 X T X X^TX XTX 为满秩矩阵(full-rank matrix)或正定矩阵(positive definite matrix)时,令公式 (15) 为零可得标准方程:
(16) θ ^ = ( X T X ) − 1 X T y \hat{\theta}=(X^TX)^{-1}X^Ty \tag{16} θ^=(XTX)−1XTy(16)
其中 ( X T X ) − 1 (X^TX)^{-1} (XTX)−1 是矩阵 ( X T X ) (X^TX) (XTX) 的逆矩阵,令 x ˉ i = ( x i , 1 ) \bar{x}_i=(x_i,1) xˉi=(xi,1) ,则最终学得的多元线性回归模型为:
KaTeX parse error: No such environment: align* at position 9: \begin{̲a̲l̲i̲g̲n̲*̲}̲ f(\bar{x}…
2.1.3 Python 实现
我们利用 Python 简单实现一下 θ \theta θ 以及回归方程的计算,首先方程 y = 4 + 3 × x y=4+3\times x y=4+3×x生成 100 个数据点并可视化:
import numpy as np
import matplotlib.pyplot as plt
X =2* np.random.rand(100,1)
y =4+3* X + np.random.randn(100,1)
plt.plot(X, y,"b.")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([0,2,0,15])
plt.show()
标准方程需对矩阵 ( X T X ) (X^TX) (XTX) 求逆,这是一个 n × n n \times n n×n的矩阵( n n n 是特征数量)。对这种矩阵求逆计算复杂度通常为 O ( n 2.4 ) O(n^{2.4}) O(n2.4) 到 O ( n 3 ) O(n^{3}) O(n3) 之间(取决于计算实现)。换句话说,如果将特征数量翻倍,那么计算时间将乘以大约 2 2.4 = 5.3 2^{2.4}=5.3 22.4=5.3 倍到 2 3 = 8 2^{3}=8 23=8 倍之间。[3]
特征数量较大时(例如 100 000)时,标准方程的计算将极其缓慢
好的一面是,相对于训练集中的实例数量 O ( m ) O(m) O(m) 来说,方程式线性的,所以能够有效的处理大量的训练集,只要内存足够。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
bmi_life_data = pd.read_csv("data/bmi_and_life_expectancy.csv")
bmi_life_model = LinearRegression()
bmi_life_model.fit(bmi_life_data[['BMI']], bmi_life_data[['BMI']])
y_1 = bmi_life_model.predict(np.array(min(bmi_life_data['BMI'])).reshape(-1,1))
y_2 = bmi_life_model.predict(np.array(max(bmi_life_data['BMI'])).reshape(-1,1))
y_1 = y_1.tolist()
y_1 =[y for x in y_1 for y in x]
y_2 = y_2.tolist()
y_2 =[y for x in y_2 for y in x]
plt.plot(bmi_life_data['BMI'], bmi_life_data['BMI'],'b.')
plt.plot([min(bmi_life_data['BMI']),max(bmi_life_data['BMI'])],[y_1, y_2],"r-")
plt.xlabel("BMI")
plt.ylabel('life_expectancy')
plt.show()
Open Source Obfuscators
ProGuard
http://java-source.net/open-source/obfuscators/proguardProGuard is a free Java class file shrinker and obfuscator. It can detect and remove unused classes, fields, m
Maven简介
是什么?
Is a software project management and comprehension tool.项目管理工具
是基于POM概念(工程对象模型)
[设计重复、编码重复、文档重复、构建重复,maven最大化消除了构建的重复]
[与XP:简单、交流与反馈;测试驱动开发、十分钟构建、持续集成、富有信息的工作区]
功能:
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
前面3步应该没有问题,主要的问题是执行make的时候,出现了异常。
异常一:
make[2]: cc: Command not found
异常原因:没有安装g
nimbus结点配置(storm.yaml)信息:
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional inf