2.线性模型
https://gitee.com/fakerlove/machine-learning
2.1 基本形式
给定由d个属性描述的示例,其中是x在第i个属性上取值,线性模型试图学得一个通过属性的线性组合来进行预测的函数,即
一般由向量形式写成
其中
例子
给定一个关系,
此时的
当的个数为个时,就是维向量。目标就是求w和b
2.2 线性回归
2.2.1 问题描述
给定的数据集其中。使用线性回归试图学习一个线性模型尽可能的预测实值输出标记
依次类推,就可以得到,然后根据这些数据,推出一个线性模型
2.2.2 一元线性回归
1) 问题描述
一元线性,表示只有一个属性,即d=1,
w,b为单个数。此时如下
求解出w和b的值
均方误差
均方误差是回归任务中最常用的性能度量
它对应了常用的欧几里得距离或简称欧式距离
这里有两种方式:
- 一种是“最小二乘法”(least square method),可直接求解;
- 另一种是梯度下降(gradient descent),有关梯度下降的方法原理可参考我之前这篇文章 -
2) 最小二乘法
基于均方误差最小化来进行模型求解的方法称为最小二乘法
简单讲
化成了关于w和b函数,方法叫做最小二乘法
参数估计
具体过程如下,也叫作最小二乘的参数估计
的值
3) 梯度下降
https://zhuanlan.zhihu.com/p/36616740
在文章最下面就有梯度下降的更新公式
可得和的更新公式为:
故
其中一个大于0的正数,通常称之为步长或学习率(learning rate)。
2.2.3 多元线性回归
1) 问题描述
数据集D是开头的属性描述,样本由d个属性描述,我们试图学得
,使得
2) 求解过程
矩阵转置,行列式结果不变。
的矩阵和的矩阵,结果为的矩阵
也是一个的矩阵,然后进行计算
之前的一元线性回归
$argmin_{(w,b)}\sum_{i=1}^m(y_i-wx_i-b)^2 argmin_{(w,b)}(y-X\widehat{w})^T(y-\widehat{X}\widehat{w})$
求出的解为
$\widehat{x}_i^T $是的矩阵
是矩阵
是的矩阵
是
2.2.3 对数线性回归
我们可以把线性回归模型简写成
2.2.4 广义线性模型
很显然对数线性回归是广义线性模型时的特例
逻辑回归和线性回归都是广义的线性回归
2.3 对数几率回归(逻辑回归)
1.1什么是分类和回归 区分回归问题和分类问题:
- 回归问题:输入变量和输出变量均为连续变量的问题;
- 分类问题:输出变量为有限个离散变量的问题。
因此分类及回归分别为研究这两类问题的方法。
逻辑回归既可以看做是回归算法,也可以看做是分类算法,通常作为分类算法用,只可以解决二分类问题。对于多分类问题,逻辑回归一般不可以解决。
相应有哪些常用方法
常见的分类方法: 逻辑回归、决策树分类、KNN(K-近邻)分类、贝叶斯分类、人工神经网络、支持向量机(SVM)等
常见的回归方法: 线性回归、多项式回归、逐步回归等 (常见的聚类方法:K-Means(K均值)聚类等)
2.3.1 概念简述
因为逻辑回归本质是个概率函数,并根据概率值来进行分类,假设概率值为p,假设当概率值大于等于0.5时,则将结果分类为1,否则分类为0,比如肿瘤预测,当概率值大于等于0.5则为恶性肿瘤,小于0.5则为良性肿瘤,根据样本x的输入,得到的概率函数如下所示:
最简单的就是“单位阶跃函数”(unit-step function),如下图所示
但是由于单位阶跃函数不连续。这里就用到了对数几率函数 (形状如图中黑色曲线所示):
对数几率函数
目的: 用线性回归模型的结果与逼近真实标记的对数几率
函数如下:
2.3.2 原理
https://zhuanlan.zhihu.com/p/36670444
https://blog.csdn.net/murphy852/article/details/107353753
1) 损失函数
对于任何机器学习问题,都需要先明确损失函数,LR模型也不例外,在遇到回归问题时,通常我们会直接想到如下的损失函数形式 (平均误差平方损失 MSE):
但在 LR 模型要解决的二分类问题中,损失函数式什么样的呢?先给出这个损失函数的形式,可以看一看思考一下,然后再做解释。
这个损失函数通常称作为 对数损失 (logloss),这里的对数底为自然对数 ,其中真实值是有 0/1 两种情况,而推测值由于借助对数几率函数,其输出是介于0~1之间连续概率值。仔细查看,不难发现,当真实值第一项为0,当真实值,第二项为0,所以,这个损失函数其实在每次计算时永远都只有一项在发挥作用,那这不就可以转换为分段函数了吗,分段的形式如下:
2) 优化求解
直接写结果,更新函数为
考虑所有样本点计算方法为:
转换成矩阵的计算方式为
2.3.3 区别
逻辑回归和线性回归的区别于联系
- 逻辑回归和线性回归首先都是广义的线性回归。
- 经典线性模型的优化目标函数是最小二乘,而逻辑回归则是似然函数。
- 线性回归在整个实数域范围内进行预测,敏感度一致,而分类范围,需要在[0,1]。逻辑 回归就是一种减小预测范围,将预测值限定为[0,1]间的一种回归模型,因而对于这类问题来说,逻辑回归的鲁棒性比线性回归的要好。
- 线性回归模型无法做到sigmoid的非线性形式,sigmoid可以轻松处理0/1分类问题。
2.3.4 小结
逻辑回归损失函数推导:
逻辑回归参数迭代公式:
其中:
2.4 线性判别分析LDA
先看
https://zhuanlan.zhihu.com/p/32658341
线性判别分析叫做LDA,**LDA是一种监督学习的降维技术,**也就是说它的数据集的每个样本是有类别输出的。LDA在模式识别领域(比如人脸识别,舰艇识别等图形图像识别领域)中有非常广泛的应用
主要是用于降维和分类的,
2.4.1 思想
给定训练样例集,设法将样例投影到一条直线上,使得同样样例的投影点尽可能接近,异类样例的投影点尽可能远离,在对新鲜样例进行分类时,将其投影到同样的这条直线上,再根据投影点的位置确定新样本的类别
例子
假设有两类数据,分别为红色和蓝色,如下图所示,这些数据特征是二维的,希望将这些数据投影到一维的一条直线,让每一种类别数据的投影点尽可能的接近,而红色和蓝色数据中心之间的距离尽可能的大。
上图中提供了两种投影方式,哪一种能更好的满足我们的标准呢?从直观上可以看出,**右图要比左图的投影效果好,因为右图的黑色数据和蓝色数据各个较为集中,且类别之间的距离明显。**左图则在边界处数据混杂。以上就是LDA的主要思想了,当然在实际应用中,数据是多个类别的,我们的原始数据一般也是超过二维的,投影后的也一般不是直线,而是一个低维的超平面。
2.4.2 瑞利商与广义瑞利商
https://www.cnblogs.com/pinard/p/6244265.html
2.4.3 二类LDA原理
2.4.4 多类LDA原理
2.4.5 LDA原理与流程
1) 书上流程
2) 前期数学准备
协方差矩阵
3) 具体流程
给定数据集
令分别表示第类示例的样本个数,样本集合,均值向量,协方差矩阵
$\mu_i \mu_i=\frac{1}{N_i}\sum_{x\in X_i}x(i=0,1)$
的表达式为
任意样本在直线w上的投影为
两类类别的中心点,对应的投影点分别为
用数学表达为
但是只考虑行不行?不行
样本点均匀分布在椭圆里,投影到横轴 上时能够获得更大的中心点间距 ,但是由于有重叠, 不能分离样本点。投影到纵轴上,虽然 较小,但是能够分离样本点。因此我们还需要考虑同类样本点之间的方差,同类样本点之间方差越小, 就越难以分离。
我们引入另外一个度量值,称作散列值( scatter),对投影后的类求散列值,如下:
而我们想要的投影后的样本点的样子是:不同类别的样本点越分开越好,同类的越聚集越好,也就是均值差越大越好,散列值越小越好。 正好,我们同时考虑使用 和 来度量,则可得到欲最大化的目标:
接下来的事就比较明显了,我们只需寻找使最大的w
展开散列值
中间的部分就是我们之前定义的协方差矩阵
我们直接替换
这个公式的样子不就是少除以样例数的协方差矩阵么,称为散列矩阵( scatter matrices)。
上面的目标函数变成了
这就是LDA 最大化目标,与的广义瑞利商
注意到式子中的分子和分母都是关于w的二项式,因此的解和w的长度无关,只与其方向有关(w为投影后直线的方向)。
令,求
用拉格朗日乘子法等价于
其中 为拉格朗日乘子,注意到的方向恒为
令
2.4.6 LDA与PCA
LDA用于降维,和PCA有很多相同,也有很多不同的地方,因此值得好好的比较一下两者的降维异同点。
相同点
**1)**两者均可以对数据进行降维。
**2)**两者在降维时均使用了矩阵特征分解的思想。
**3)**两者都假设数据符合高斯分布。
不同点
**1)**LDA是有监督的降维方法,而PCA是无监督的降维方法
**2)**LDA降维最多降到类别数k-1的维数,而PCA没有这个限制。
**3)**LDA除了可以用于降维,还可以用于分类。
**4)**LDA选择分类性能最好的投影方向,而PCA选择样本点投影具有最大方差的方向。这点可以从下图形象的看出,在某些数据分布下LDA比PCA降维较优。
2.4.7 小结
**LDA算法既可以用来降维,又可以用来分类,但是目前来说,主要还是用于降维。****在进行图像识别相关的数据分析时,LDA是一个有力的工具。**下面总结下LDA算法的优缺点。
优点
**1)**在降维过程中可以使用类别的先验知识经验,而像PCA这样的无监督学习则无法使用类别先验知识。
**2)**LDA在样本分类信息依赖均值而不是方差的时候,比PCA之类的算法较优。
缺点
**1)**LDA不适合对非高斯分布样本进行降维,PCA也有这个问题。
**2)**LDA降维最多降到类别数k-1的维数,如果我们降维的维度大于k-1,则不能使用LDA。当然目前有一些LDA的进化版算法可以绕过这个问题。
**3)**LDA在样本分类信息依赖方差而不是均值的时候,降维效果不好。
**4)**LDA可能过度拟合数据。
2.5 多分类学习
把多分类任务拆分成若干个二分类任务,最经典的三个拆分策略
- 一对一(OvO)
- 1对其余(OvR)
- 多对多(MvM)
2.6 类别不平衡
类别不平衡就是指分类任务中不同类别的训练样例数目差别很大的情况,不失一般性。比如有998个反例,但是正例有2个
正常的分类器决策规则为
时,预测为正例
当正反例子数目不同时,
令为正例,为反例。分类器的决策规则为$\frac{y^\prime}{1-y^\prime}=\frac{y}{1-y}\times\frac{m^-}{m^+}>1 $时为正例
2.7 梯度下降
梯度下降法 —— 经典的优化方法
2.7.1 概述
梯度下降(gradient descent)在机器学习中应用十分的广泛,不论是在线性回归还是Logistic回归中,它的主要目的是通过迭代找到目标函数的最小值,或者收敛到最小值。
尤其是在深度学习(神经网络)模型中,BP反向传播方法的核心就是对每层的权重参数不断使用梯度下降来进行优化。
梯度下降法(gradient descent)是一种常用的一阶(first-order)优化方法,是求解无约束优化问题最简单、最经典的方法之一。
更新公式
2.7.2 场景假设
一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢,首先以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处;同理上山也是如此,只是这时候就变成梯度上升算法了
同理
首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向。
2.7.3 前期数学准备
资料参考
https://blog.csdn.net/walilk/article/details/50978864
1) 导数
这是高数中的一张经典图,如果忘记了导数微分的概念,基本看着这张图就能全部想起来。
导数定义如下:
反映的是函数在某一点处沿x轴正方向的变化率。再强调一遍,是函数在x轴上某一点处沿着x轴正方向的变化率/变化趋势。直观地看,也就是在x轴上某一点处,如果,说明f(x)的函数值在x点沿x轴正方向是趋于增加的;如果,说明f(x)的函数值在x点沿x轴正方向是趋于减少的。
这里补充上图中的Δy、dy等符号的意义及关系如下: Δx:x的变化量; dx:x的变化量Δx趋于0时,则记作微元dx; Δy:Δy=f(x0+Δx)-f(x0),是函数的增量; dy:dy=f’(x0)dx,是切线的增量; 当Δx→0时,dy与Δy都是无穷小,dy是Δy的主部,即Δy=dy+o(Δx).
2) 导数和偏导数
偏导数的定义如下:
区别在于:
- 导数,指的是一元函数中,函数y=f(x)在某一点处沿x轴正方向的变化率;
- 偏导数,指的是多元函数中,函数在某一点处沿某一坐标轴正方向的变化率。
3) 导数和梯度
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
梯度的提出只为回答一个问题:
函数在变量空间的某一点处,沿着哪一个方向有最大的变化率?
梯度定义如下:
函数在某一点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。 这里注意三点: 1)梯度是一个向量,即有方向有大小; 2)梯度的方向是最大方向导数的方向; 3)梯度的值是最大方向导数的值。
4) 梯度意义
- 在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率
- 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向
我们需要到达山底,就需要在每一步观测到此时最陡峭的地方,梯度就恰巧告诉了我们这个方向。梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以我们只要沿着梯度的方向一直走,就能走到局部的最低点!
5) 一阶泰勒展开式
不懂上面的公式?没有关系。我用下面这张图来解释。
凸函数的某一小段由上图黑色曲线表示,可以利用线性近似的思想求出的值,如上图红色直线。该直线的斜率等于在处的导数。则根据直线方程,很容易得到的近似表达式为:
2.7.4 推导
我么来考虑一个无约束优化问题求f(x)的最小值
其中为连续可微函数,如果我们能够构造一个序列
并能够满足
那么我们就能够不断执行该过程即可收敛到局部极小点,可参考下图。
如何找到以下一个点,并且保障
假设我们当前的函数 的形式是上图的形状,现在我们随机找了个初始的点 ,对于一元函数来说,函数值只会随着 x 的变化而变化,那么我们就设计下一个是从上一个沿着某一方向走一小步得到的。此处的关键问题就是:这一小步的方向是朝向哪里?
对于一元函数来说, x是会存在两个方向:要么是正方向(),要么是负方向( ),如何选择每一步的方向,就需要用到大名鼎鼎的泰勒公式,先看一下下面这个泰勒展式:
矢量微分算符
表示关于的函数,表示梯度
表示函数在当前位置的导数
左边就是当前的x移动一小步之后的下一个点位,它近似等于右边。
前面我们说了关键问题是找到一个方向,使得 ,
那么根据上面的泰勒展式,显然我们需要保证:
可选择令:
,
其中步长 是一个比较小的正数,从而
由于任何不为0 的数的平方均大于0 ,保证了,从而设定
保证
确定的方式就很简单了,
按照公式
这就是所谓的沿负梯度方向走一小步。
到此为止,这就是梯度下降的全部原理。
如果稍有不清楚的地方,再用下图重新回顾一下具体的设计过程:
代码参考
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return np.power(x, 2)
def d_f_1(x):
return 2.0 * x
def d_f_2(f, x, delta=1e-4):
return (f(x+delta) - f(x-delta)) / (2 * delta)
# plot the function
xs = np.arange(-10, 11)
plt.plot(xs, f(xs))
plt.show()
learning_rate = 0.1
max_loop = 30
x_init = 10.0
x = x_init
lr = 0.1
for i in range(max_loop):
d_f_x = d_f_2(f, x)
x = x - learning_rate * d_f_x
print(x)
print('initial x =', x_init)
print('arg min f(x) of x =', x)
print('f(x) =', f(x))
示例二-和上面图像无关
from numpy import *
# 数据集大小 即20个数据点
m = 20
# x的坐标以及对应的矩阵
X0 = ones((m, 1)) # 生成一个m行1列的向量,也就是x0,全是1
X1 = arange(1, m+1).reshape(m, 1) # 生成一个m行1列的向量,也就是x1,从1到m
X = hstack((X0, X1)) # 按照列堆叠形成数组,其实就是样本数据
# 对应的y坐标
Y = array([
3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,
11, 13, 13, 16, 17, 18, 17, 19, 21
]).reshape(m, 1)
# 学习率
alpha = 0.01
# 定义代价函数
def cost_function(theta, X, Y):
diff = dot(X, theta) - Y # dot() 数组需要像矩阵那样相乘,就需要用到dot()
return (1/(2*m)) * dot(diff.transpose(), diff)
# 定义代价函数对应的梯度函数
def gradient_function(theta, X, Y):
diff = dot(X, theta) - Y
return (1/m) * dot(X.transpose(), diff)
# 梯度下降迭代
def gradient_descent(X, Y, alpha):
theta = array([1, 1]).reshape(2, 1)
gradient = gradient_function(theta, X, Y)
while not all(abs(gradient) <= 1e-5):
theta = theta - alpha * gradient
gradient = gradient_function(theta, X, Y)
return theta
optimal = gradient_descent(X, Y, alpha)
print('optimal:', optimal)
print('cost function:', cost_function(optimal, X, Y)[0][0])
# 根据数据画出对应的图像
def plot(X, Y, theta):
import matplotlib.pyplot as plt
ax = plt.subplot(111) # 这是我改的
ax.scatter(X, Y, s=30, c="red", marker="s")
plt.xlabel("X")
plt.ylabel("Y")
x = arange(0, 21, 0.2) # x的范围
y = theta[0] + theta[1]*x
ax.plot(x, y)
plt.show()
plot(X1, Y, optimal)
2.7.5 梯度下降法大家族
1) 批量梯度下降法
(Batch Gradient Descent)-BGD
批量梯度下降法,是梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新,这个方法对应于前面的线性回归的梯度下降算法,也就是说的梯度下降算法就是批量梯度下降法。
更新公式
2) 随机梯度下降法
SGD(Stochastic Gradient Descent)
随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本j来求梯度。
目标函数
求偏导
更新公式
SGD可以看作是MBGD的一个特例
3) 小批量梯度下降法
MBGD(Mini-batch Gradient Descent)
小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个样子来迭代,1<x<m。一般可以取x=10,当然根据样本的数据,可以调整这个x的值。
更新公式:
算法 | 用途 | 优点 | 缺点 |
---|---|---|---|
批量梯度下降法 | 由于我们有m个样本,这里求梯度的时候就用了所有m个样本的梯度数据。 针对的是整个数据集,通过对所有的样本的计算来求解梯度的方向。 | 全局最优解;易于并行实现; | 当样本数据很多时,计算量开销大,计算速度慢 |
小批量梯度下降法 | 把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性 | 减少了计算的开销量,降低了随机性 | |
随机梯度下降法 | 每个数据都计算算一下损失函数,然后求梯度更新参数。 | 计算速度快 | 收敛性能不好 |
2.7.6 比较
在机器学习中的无约束优化算法,除了梯度下降以外,还有前面提到的最小二乘法,此外还有牛顿法和拟牛顿法。
梯度下降法和最小二乘法相比,梯度下降法需要选择步长,而最小二乘法不需要。梯度下降法是迭代求解,最小二乘法是计算解析解。如果样本量不算很大,且存在解析解,最小二乘法比起梯度下降法要有优势,计算速度很快。但是如果样本量很大,用最小二乘法由于需要求一个超级大的逆矩阵,这时就很难或者很慢才能求解解析解了,使用迭代的梯度下降法比较有优势。
梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。