您的位置:首页 > 其它

机器学习笔记总结(1):线性回归(LS),逻辑回归(LR),朴素贝叶斯(NB),支持向量机(SVM)

2018-10-30 17:31 246 查看

1.1 机器学习

1. 机器学习:What and Why

为什么要机器学习?进入大数据时代,需要自动化处理数据,检测数据中的特征。用概率论来解决机器学习中的不确定性。例如:通过收集到的数据来预测未来,寻找解释数据的最佳模型,等等。

 

2. 机器学习的不同类型:

(1)有监督的学习(Supervised learning)或者称为预测问题(predictive learning):实际上就是指的是训练集是有标签的,使用训练集的数据训练出预测标签结果的模型。

给定了输入和输出(input-output pairs),$$D = {(x_i,y_i)}_{i=1}^N$$,D称为训练集。举个最简单的例子,假设x表示身高,y表示人的体重。给了N对身高-体重的数据,训练出模型使得给出一个人的身高能够较准确的预测出体重。假设训练出的模型$y = ax+b$,其中$a, b$表示某个常量(constant),这就是最简单的一个一元线性回归模型(one dimensional linear regression model),一元指的是因变量只有一个维度(dimension),线性指的是自变量与因变量的关系,如果画在图上是一条直线。

(题外话: 非线性关系可以有

Quadratic: $$f(x) = x^2$$

Logarithm: $$f(x) = ln(x)$$

Sigmoid: $$f(x) = \frac{1}{1+e^{-x}}$$

ReLU:$$f(x) = max(0, x)$$等等等等。)

x可以称为自变量(independent variable),特征(feature),属性(attribute),因子(factor)等等,实际上都是一样的东西。同样的y称为因变量(dependent variable),反应变量(response variable), 目标(target), 标签(label) 等等。变量的类型:连续的(continuous)指取值可以是任何实数。类别的(categorical or nominal) 例如取值为挂科(pass),通过(fail)。 序数的(Ordinal),例如米其林三星,米其林二星等等。

常见的有监督学习:当目标变量是categorical时,这是个分类(classification) or 模式识别(pattern recognition)问题。当目标变量是连续的,是个回归(regression)问题,例如上面从身高预测体重问题。当目标变量是ordinal的,是个ordinnal regression问题。

(2)无监督学习(unsupervised learning) 或者称为descriptive learning。区别就是给出的训练数据没有标签,$$D = {(x_i)}_{i=1}^N$$。例如聚类(Clustering), PCA (Principle component analysis)...

 

(3)Reinforcement learning: 学习偶尔给一些奖励或惩罚时怎样表现。例如婴儿学习走路。

 

1.2 有监督的学习(Supervised)

分类问题:实际上就是建立从输入值到输出值的映射。

$$D = {(x_i,y_i)}_{i=1}^N$$ $$f: x \rightarrow y$$

当输出值y是两个类别时,称为二分类(binary classification);当y有多个类别时,称为多分类(multiclass classification);假如目标类别不是互斥的(mutually exclusive),即对输入值的分类不局限于只属于某一个类,可以分到多个类别时,称为multi-label classification。

 

  • 线性回归(Linear Least Square Regression)

一维模型:$$Y = mX+b$$

数据:$$ {(x_i,y_i)}_{i=1}^N$$,N对数据,例如表示人的体重和身高。

最小二乘法,高中知识:求得使残差$$Error = min \sum_{i=1}^N(mX_i+b-Y_i)^2$$,意思是我们希望通过某个m, b求得的预测值mXi+b和实际值Yi相差最小。

对Error分别对m和b求偏导数,当偏导数为0时我们知道达到了局部极小值点:

$$\frac{\partial}{\partial b}\left(\sum_{i=1}^N(mX_i+b-Y_i)^2 \right) = 0$$得到 $$b = E(Y) - m E(X)$$

$$\frac{\partial}{\partial m}\left(\sum_{i=1}^N(mX_i+b-Y_i)^2 \right) = 0$$得到$$m = \frac{Cov(X,Y)}{Var(X)}$$

 

多维模型: $$Y = \textbf{w}\textbf{X} + b$$

简单表示:$$\textbf{w} = (w_1, w_2, ..., w_p, b)^{T}$$ $$\textbf{x} = (x_1, x_2, ..., x_p, 1)^{T},$$其中p表示维度。


$$\textbf{X}=
  \begin{bmatrix}
    \textbf{x}_1^{T} & 1  \\
    ...\\
    \textbf{x}_N^{T}  & 1
  \end{bmatrix}$$

$$Error = \sum_{i=1}^N(Y_i - \textbf{w} \textbf{x_i})^2 = (Y-\textbf{X}\textbf{w})^{T}(Y-\textbf{X}\textbf{w})$$

求偏微分

$$\frac{\partial Error}{\partial w_i}$$

得到

$$\textbf{w} = (X^TX)^{-1}X^TY$$

上面这种解决方法需要求矩阵的乘积,矩阵的逆,对于维度p特别大的情况下,可能是很恐怖的一件事情,更别说有的矩阵没有逆矩阵。

解决方法有很多种,下面用梯度下降(gradient decent)求解:

$$\nabla Error = 2X^T(Xw-y)$$

$$w(k+1) = w(k) - \eta\nabla Error$$, $\eta$是学习率,是个常数,另外牛顿法中使用Hessian matrix的逆代替这个常数,收敛加速,但是求矩阵的逆比较cost expensive。

下面用numpy随机生成100个点(x_data,y_data),然后使用平方残差做loss function,用gradient descent求使loss function最小的斜率k和截距b。参考 python 3 + tensorflow 1.8

[code]import tensorflow as tf
import numpy as np
# generate 100 random samples
x_data = np.random.rand(100)
y_data = x_data*0.1+0.2

b = tf.Variable(0.)
k= tf.Variable(0.)
# the linear model
y = k*x_data+b

# cost function least squares estimation
loss = tf.reduce_mean(tf.square(y - y_data))
# gradient descent
optimizer = tf.train.GradientDescentOptimizer(0.2) # learning rate = 0.2
# objective: minimise the cost function
train = optimizer.minimize(loss)

# init
init = tf.global_variables_initializer()

with tf.Session() as sess:
sess.run(init)
for step in range(201):
sess.run(train)
if step%20 ==0:
print(sess.run([k,b]))

ps. 用梯度下降求开根号(Go lang 1.11.1):

[code]package main

import (
"fmt"
"math"
)

func mysqrt(x float64) float64 {
iter := 1e-7 \\精度
z := 1.0  \\初始值,瞎设为1
for math.Abs(z*z-x) > iter {
z -= (z*z - x) / (2 * z) \\使用梯度下降迭代
}
return z
}
func main() {
fmt.Println(mysqrt(2))
fmt.Println(math.Sqrt(2))
}
  • 逻辑回归(Logistic Regression)

通过线性回归得到的模型有一个问题,自变量和因变量都是没有边界的(unbounded)。假设自变量x是体重,预测身高y,180斤对应180cm,当体重无限上升时200kg 300kg...,身高可能不会无限增加 180cm, 180cm,180cm...(开个玩笑)。

逻辑回归非线性的表达解决了这个问题。

假设目标变量y的取值在0或1之中,而自变量的取值为全体实数。设p(x)是y取1的概率,则 1 - p(x)是y取0的概率。$$\frac{p(x)}{1-p(x)}$$被称为比值(odds ratio),意思就是两种结果的比,在赌博中,常被称为赔率。

逻辑回归的目标就是求得y的条件期望,等同于求y=1的条件概率。$$E(y|x)= Pr(y = 1| x)$$

设定odds ratio的log符合线性关系$$log(\frac{p(x)}{1-p(x)}) = wx+b,$$因此求得

$$p(x) = \frac{1}{1+e^{-(wx+b)}}$$

 

求解:

Likelihood function: 就是求得使期望最大的w和b

$$L = \prod\limits_{i=1}^{N}p(x_i)^{y_i}(1-p(x))^{1-y_i}$$

众所周知,一大堆乘积的形式不好求导,因此做log变换,变为一大堆项的和,变换前后,该是某个x使得l是最大值,也会使得L最大值。

$$l = log(L) = \sum_{i=1}^{N}\left[ y_i log(p(x_i))+(1-y_i)log(1-p(x_i)) \right]$$

化简

$$= \sum_{i=1}^{N} log(1-p(x_i)) +\sum_{i=1}^{N}y_i log \frac{p(x_i)}{1-p(x_i)}$$

$$= \sum_{i=1}^{N} log(1-p(x_i)) +\sum_{i=1}^{N}y_i(b+x_iw)$$

$$= \sum_{i=1}^{N} -log(1+e^{b+wx_i})+ \sum_{i=1}^{N}y_i(b+x_iw)$$

求偏导数为0

$$\frac{\partial l}{\partial w_j} = 0$$

$$\frac{\partial l}{\partial w_j} = \sum_{i=1}^{N} (y_i - p(x_i; w,b))x_{i,j}$$

使用梯度上升 gradient ascent等等求解 参考

TBC

  • 朴素贝叶斯(Naive Baysian Classifier)

朴素贝叶斯分类器非常simple, sometimes naive,所以叫朴素(naive)。

用的是贝叶斯公式,条件概率。

假设我们有个生产线,处理西红柿,从生产线的上游会有整个的西红柿到达第一个分类器,这个分类器对西红柿做二分类,一类是熟的(w_1),一类是生的(w_2)。我们的贝叶斯分类器要根据这个西红柿的颜色,大小,重量...等指标(向量X,X的维度代表了有多少个指标)来区分西红柿到底熟没熟,来做分类。

$$P(w_j | \textbf{X}) = \frac{P(X| w_j)P(w_j)}{P(X)} = \frac{P(X| w_j)P(w_j)}{P(w_1)P(X|w_1)+P(w_2)P(X|w_2)} $$

先验概率(Prior Probability):$$P(w_j)$$

意思是我们根据以往的经验,今天收获的西红柿大概有95%是熟的。

后验概率(Posterior probability):$$P(w_j | \textbf{X})$$

意思是,根据这个西红柿的各项指标X,比如颜色:是红的,个头:挺大,软硬程度:还挺软的,我们的朴素贝叶斯分类器判断这个西红柿80%可能是熟的。然后对这个西红柿放行,进入下游生产线。

当我们对P(w1|X)和P(w2|X)做比较时,我们发现他们分母都是一样的,因此就比较一下分子P(X|w1)*P(w1)和P(X|w2)*P(w2)哪一个更大,我们就把这个观测目标分到哪一类。

举个简单的例子:

我们有两组服从高斯分布(Gaussian distribution)或正态分布(Normal distribution)的二维向量,画在图上就是一些点,两组各随机生成100个点。

因此Likelyhood 服从高斯分布 $$P(X|w_j) ~ N(\textbf{m}_j, \textbf{C}_j)$$

其中m和C代表平均值向量(mean vector)和协方差矩阵(variance-covariance matrix),如果X是一维的情况下其实就是均值(常用希腊字母mu表示)和方差(常用希腊字母sigma^2表示),不过我们这里想画出二维平面的图来表示贝叶斯分类器,所以用了二维的数据点,就得用向量和矩阵。毕竟我们是三维动物,二维的东西最容易理解。(下面的公式 w和小写的omega是一个东西,x也时大时小不要在意,是因为方便用以前latex写好的公式,现在加了一些别的,我懒得打字打一堆\omega了)

$$P[\omega_1|x] >< P[\omega_2|x]$$

$$P[x|\omega_1]P[\omega_1]><P[x|\omega_2]P[\omega_2]$$

因为我们随机生成的两个类别各100个点,两类的先验概率相等 $$P[\omega_1]=P[\omega_2] = 0.5$$

意思是给你一个点,也不告诉你这个点的坐标,让你瞎猜,你猜中的概率对半分。

因此我们可以将两边约掉P(w_j),表示为

$$P[x|\omega_1]><P[x|\omega_2]$$

因为服从高斯分布

$$P[x|w_1] = \frac{1}{(2\pi)^{p/2}(det(C_1))^{1/2}}exp(-\frac{1}{2}(x-m_1)^tC_1^{-1}(x-m_1))$$

带入得到

$$\frac{1}{(2\pi 28e1d )^{p/2}(det(C_1))^{1/2}}exp(-\frac{1}{2}(x-m_1)^tC_1^{-1}(x-m_1))><\frac{1}{(2\pi)^{p/2}(det(C_2))^{1/2}}exp(-\frac{1}{2}(x-m_2)^tC_2^{-1}(x-m_2))$$

化简得到

$$x^t(C_2^{-1}-C_1^{-1})x+2(m_1^tC_1^{-1}-m_2^tC_2^{-1})x+m_2^tC_2^{-1}m_2-m_1^tC_1^{-1}m_1-2ln\left[\left(\frac{det(C_1)}{det(C_2)}\right)^{1/2}\right]><0$$

$$b=m_2^tC_2^{-1}m_2-m_1^tC_1^{-1}m_1-2ln\left[\left(\frac{det(C_1)}{det(C_2)}\right)^{1/2}\right]$$

$$w=2(m_1^tC_1^{-1}-m_2^tC_2^{-1})$$

简化为

$$x^t(C_2^{-1}-C_1^{-1})x+wx+b><0$$

计算 $$C_2^{-1}-C_1^{-1}, \omega, b$$ 带入方程,这个分类器实际上是一个双曲函数。

 

如果我们举的例子再简单一点,让两个分布的协方差矩阵C相同。就可以简化为

$$w = 2C^{-1}(m_2-m_1)$$

$$b = (m_1^tC^{-1}m_1-m_2^tC^{-1}m_2)$$

变成了一个线性分类器(linear classifier),

$$w^tx+b = 0$$

  • 支持向量机(Support Vector Machine):参考youtube上的 Lecture by CalTech,讲的特别好。

使用SVM对【线性可分】的数据分类。

理念是给出两组数据,划出一个平面(三维时是平面,二维时是直线,高维度时是hyper-plane),使得这个平面到两组数据都尽可能的远(max margin)。那么距离平面最近的点,就称为支持向量(support vector)。因此这个平面在两个class中最近的点的中间。

设:

Hyper-plane:$$\textbf{w}^Tx + b= 0$$

*对于平面的解析方程式,可以回忆一下高中的立体几何,大学的空间解析几何。三维空间(x,y,z)的平面通常表示为Ax+By+Cz+D=0,那么高维度的hyper-plane的解析式就是上面的式子,w向量是系数(coefficients),X就是变量向量。

数据:$$D = {(x_i,y_i)}_{i=1}^N, x_i \in R^d, y_n \in {-1, 1}$$

svm是有监督的学习,数据中目标值分为两类,标记为1或-1。

问题: $$y_n [\textbf{w}^Tx+b] \geq 1, n = 1, ... ,N$$ 即两个类别的数据都分在了正确的class里面

hyperplane距离某个点x_n的距离为:$$distance(w,b,x_n) = \frac{|\textbf{w}^Tx + b|}{||\textbf{w}||}$$

因此margin就是两边最靠近hyperplane的点(支持向量)到hyperplane的距离。

$$margin(w,b) = min_{x_n: y_n = -1}d(w,b,x_n)+min_{x_n: y_n = +1}d(w,b,x_n)$$

$$ = min_{x_n: y_n = -1}\frac{|\textbf{w}^Tx + b|}{||\textbf{w}||}+min_{x_n: y_n = +1}\frac{|\textbf{w}^Tx + b|}{||\textbf{w}||}$$

$$ = \frac{1}{||\textbf{w}||}( min_{x_n: y_n = -1}|\textbf{w}^Tx + b|+min_{x_n: y_n = +1}|\textbf{w}^Tx + b|)$$

$$ = \frac{2}{||\textbf{w}||}$$

上面最后一步令支持向量到hyperplane的距离normalise了,即除以某个常数使得得到的值是1,不影响求最大最小值。

上式中求margin最大,即求1/w最大,w在分母不好求解,因此我们换成求w的最小,又为了好求导数,换成求w的平方最小。

带入上面的约束条件:$$y_n [\textbf{w}^Tx+b] \geq 1, n = 1, ... ,N$$

拉格朗日(Lagrangian)表达式:$$L(w,b,\alpha) = \frac{1}{2}||\textbf{w}||^2 - \sum_{n=1}^{N} \alpha_n(y_n [\textbf{w}^Tx+b] -1)$$

其中$$\alpha_n \geq 0$$是拉格朗日参数

令偏导数为0 $$\frac{\partial L}{\partial b} = 0 \Rightarrow \sum_{n=1}^{N} \alpha_n y_n = 0$$

$$\frac{\partial L}{\partial \textbf{w}} = 0 \Rightarrow \textbf{w} = \sum_{n=1}^{N} \alpha_n y_n x_n$$

将这两个式子带入拉格朗日方程,化简得到对偶问题(Dual Problem)

$$max_{\alpha} -\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_i \alpha_j y_i y_j \textbf{x}_i^t \textbf{x}_j +\sum_{k=1}^{N} \alpha_k$$

$$subject to \quad \alpha_n \geq 0 \quad and \quad \sum_{n=1}^{N} \alpha_n y_n = 0$$

用矩阵简化表示,其实是一个Quadratic Programming问题。

$$min_x \frac{1}{2} \textbf{x}^t H \textbf{x} +f^t \textbf{x}$$

$$subject \quad to Ax \leq b, A_{eq}x = b_{eq}, lb \leq x \leq ub$$

用matlab(quadprog函数),python(CVXOPT)等等的现成的库都可以解决。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: