1. 线性回归
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。
直观地说,在二维情况下,已知一些点的X,Y坐标,统计条件X与结果Y的关系,画一条直线,让直线离所有点都尽量地近(距离之和最小),用直线抽象地表达这些点,然后对新的X预测新的Y。具体实现一般使用最小二乘法。
线性回归的优点是理解和计算都相对简单,缺点是无法解决非线性问题。
2. 最小二乘法
1) 原理
最小二乘法(ordinary least squares,简称OLS)的核心就是保证所有数据偏差的平方和最小(“平方”的在古时侯的称谓为“二乘”)。
我们用直线拟合一些点,直线方程是 y’=ax+b ,每点偏差是y-y’,其中y是实际值,y’是估计值。sum((y-y’)^2) 最小时,直线拟合最好。上试代入y’,可得 M=sum((y-(ax+b))^2) ,对它求导取极值。此时,x,y是已知的,未知的是a和b,所以分别求M对a和b的偏导,解出的a,b即回归系数,记作W。线性回归就是计算参数W的过程。有了W,就能将Y表示成多属性的加权线性组合。
假设有两个变量(多元回归)y’=w0+w1x1+w2x2,就变成了一个三维的问题,同样也用误差平方最小的方法M=sum((y’-(w0+w1x1+w2x2))^2),M对w0,w1,w2的偏导为0处是极值,然后解出w0,w1,w2。更多元的情况见下面的公式推导。
预测时,用回归系数乘以输入值,再将结果加在一起就得到了预测值,一般用矩阵乘法实现。
2) 公式推导
通过矩阵运算求解回归系数的W={w0,w1,w2…}
3. 线性回归代码实现
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
# 训练
def standRegres(xArr,yArr):
m,n = np.shape(xArr)
xMat = np.mat(np.ones((m, n+1))) # 加第一列设为1,为计算截距
x = np.mat(xArr)
xMat[:,1:n+1] = x[:,0:n];
yMat = np.mat(yArr).T
xTx = xMat.T*xMat
if np.linalg.det(xTx) == 0.0:
print("This matrix is sigular, cannot do inverse") #行列式的值为0,无逆矩阵
return
ws = xTx.I*(xMat.T*yMat)
return ws
# 预测
def predict(xArr, ws):
m,n = np.shape(xArr)
xMat = np.mat(np.ones((m, n+1))) # 加第一列设为1, 为计算截距
x = np.mat(xArr)
xMat[:,1:n+1] = x[:,0:n];
return xMat*ws
if __name__ == '__main__':
x = [[1], [2], [3], [4]]
y = [4.1, 5.9, 8.1, 10.1]
ws = standRegres(x,y)
print(ws)
print(predict([[5]], ws))
# 画图
plt.scatter(x, y, s=20)
yHat = predict(x, ws)
plt.plot(x, yHat, linewidth=2.0, color='red')
plt.show()
注意:回归系数的个数应该比属性多一个,用于表示截距,在sklearn中也是这样,只不过截距相关的放在intercept_中,其它放在coef_中。
4. 逻辑回归
逻辑回归,也叫逻辑斯蒂回归,logistic regression。
有监督学习常分成:分类和回归,不要一听xx回归,以为就是预测具体值了,这里的“逻辑回归”其实是个分类的方法。之所以叫逻辑回归,是因为最常见用它处理二分类问题,即分类为0或1(逻辑值)。如图所示,它是用一条直线,将实例分类。
与线性回归不同的只是这里的Y是分类0或1,而不是具体数值。所以它叫广义线性模型。
把具体数据对应成0,1的方法是sigmoid,sigmoid函数只能分两类,而softmax能分多类,softmax是sigmoid的扩展。
5. Sigmoid函数
Sigmoid函数,就是S型函数,这就是一个数值和逻辑值间转换的工具,如下图示,它把X从负无穷到正无穷映射到Y的0-1之间。很多时候需要求极值,而0,1分类不是连续的,不可导,所以用一个平滑的函数拟合逻辑值,因为用了它,所以这叫逻辑回归。