机器学习 2014斯坦福大学课程: 2 逻辑回归
刚开始学习机器学习,学习的视频教程是coursera网站上吴恩达(Andrew Ng)教授的机器学习课程。
在此梳理并记录总结笔记,供学习交流,欢迎批评指正!
机器学习 分类 回顾
- 监督学习(supervised learning )
1.1 回归问题(regression)
1.2分类问题(classification)
肿瘤大小与肿瘤恶性或良性,判断是否为垃圾邮件,是或者不是, 两者取一,离散值
解决方法之一:逻辑回归方法(logistic regression)
- 无监督学习(unsupervised learning)
2.1 聚集问题(clustering)
2.2. 非聚集问题(non-clustering)
逻辑回归
问题:肿瘤大小(tumor size)与肿瘤是否为恶性(1:恶性 0:良性)的关系。Training example如下图所示:
仿照前一节线性回归问题,则
抽象出数学问题
:
-
过程
1.1
参数
x1 :表示肿瘤大小
y:表示恶性(1)或者良性(0),只能取1或者0
m:样本数
n:特征数,此问题中为1
假设
h ( θ 0 , θ 1 ) = θ 0 ∗ x 0 + θ 1 ∗ x 1 h(\theta_0,\theta_1)=\theta_0*x_0+\theta_1*x_1 h(θ0,θ1)=θ0∗x0+θ1∗x1
由于我们y取离散值,若仍然使用线性回归问题的直线拟合,肯定会预测值出现大于1或者小于0的情况
因此引入sigmoid函数,则
h ( θ 0 , θ 1 ) = g ( θ 0 ∗ x 0 + θ 1 ∗ x 1 ) h(\theta_0,\theta_1)=g(\theta_0*x_0+\theta_1*x_1) h(θ0,θ1)=g(θ0∗x0+θ1∗x1)
g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+e−z1
那么,
h ( θ 0 , θ 1 ) = 1 1 + e − ( θ 0 ∗ x 0 + θ 1 ∗ x 1 ) h(\theta_0,\theta_1)=\frac{1}{1+e^{-(\theta_0*x_0+\theta_1*x_1)}} h(θ0,θ1)=1+e−(θ0∗x0+θ1∗x1)1
1.2 sigmoid函数:S型,取值范围(0,1)范围
h ( θ 0 , θ 1 ) h(\theta_0,\theta_1) h(θ0,θ1)意义
h ( θ 0 , θ 1 ) = P ( y = 1 ∣ x 1 ; θ ) h(\theta_0,\theta_1)=P(y=1|x_1;\theta) h(θ0,θ1)=P(y=1∣x1;θ)表示当有多大可能性y=1
1 − h ( θ 0 , θ 1 = P ( y = 0 ∣ x 1 ; θ ) ) 1-h(\theta_0,\theta_1=P(y=0|x_1;\theta)) 1−h(θ0,θ1=P(y=0∣x1;θ))表示多大可能性y=0
假设肿瘤问题已经解决,得到了 h ( θ 0 , θ 1 ) h(\theta_0,\theta_1) h(θ0,θ1)表达式
假设当 x 1 x_1 x1取值为100, h ( θ 0 , θ 1 ) h(\theta_0,\theta_1) h(θ0,θ1)输出的值为0.7
那么就是说肿瘤大小为100时,有70%的可能是恶性肿瘤,30%可能是良性肿瘤
因为概率大于50%,就认为y=1,恶性肿瘤, 小于50%,就认为y=0
1.3 成本函数(cost function):
J ( θ 0 , θ 1 , ) = 1 m ∑ i = 1 m ( − y ( i ) ∗ l o g ( h θ ( x ( i ) ) ) − ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ) J(\theta_0,\theta_1,)=\frac{1}{m}\sum_{i=1}^m (-y^{(i)}*log(h_\theta(x^{(i)}))-(1-y^{(i))}log(1-h_\theta(x^{(i)}))) J(θ0,θ1,)=m1i=1∑m(−y(i)∗log(hθ(x(i)))−(1−y(i))log(1−hθ(x(i))))
= 1 m ∑ i = 1 m { − y ( i ) ∗ l o g ( h θ ( x ( i ) ) ) y = 1 − ( 1 − y ( i ) ) ) l o g ( 1 − h θ ( x ( i ) ) ) y = 0 =\frac{1}{m}\sum_{i=1}^m\begin{cases}-y^{(i)}*log(h_\theta(x^{(i)})) & y=1 \\ -(1-y^{(i))})log(1-h_\theta(x^{(i)})) & y=0\end{cases} =m1i=1∑m{−y(i)∗log(hθ(x(i)))−(1−y(i)))log(1−hθ(x(i)))y=1y=0
图像为:
当y=1时,J=0,越远离1,J越大,成本越高
当y=1时,J=0,越远离1,J越大,成本越高
1.4 m i n J ( θ 0 , θ 1 ) minJ(\theta_0,\theta_1) minJ(θ0,θ1)
∂ J ( θ ) ∂ θ = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) ∗ x ( i ) \frac{\partial J(\theta)}{\partial \theta}=\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})*x^{(i)} ∂θ∂J(θ)=m1i=1∑m(hθ(x(i))−y(i))∗x(i)
与线性回归算法的偏导数表达式一致
证明过程略 -
完整数学描述
问题
h ( θ 0 , θ 1 ) = g ( θ 0 ∗ x 0 + θ 1 ∗ x 1 ) h(\theta_0,\theta_1)=g(\theta_0*x_0+\theta_1*x_1) h(θ0,θ1)=g(θ0∗x0+θ1∗x1)
h ( θ ) = g ( X ∗ t h e t a ) h(\theta)=g(X*theta) h(θ)=g(X∗theta)
其中, g ( z ) g(z) g(z) sigmoid函数为
g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+e−z1
那么,
y = { 1 h ( θ ) ≥ 0.5 0 h ( θ ) < 0.5 y=\begin{cases}1&h(\theta)\ge0.5\\0 &h(\theta)\lt0.5\\\end{cases} y={10h(θ)≥0.5h(θ)<0.5
成本函数
J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m ( − y ( i ) ∗ l o g ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ) J(\theta_0,\theta_1)=\frac{1}{m}\sum_{i=1}^m (-y^{(i)}*log(h_\theta(x^{(i)}))+(1-y^{(i))}log(1-h_\theta(x^{(i)}))) J(θ0,θ1)=m1i=1∑m(−y(i)∗log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))
J ( θ ) = 1 m ∑ i = 1 m ( − y . ∗ l o g ( h ( θ ) ) + ( 1 − y ) . ∗ l o g ( 1 − h ( θ ) ) ) J(\theta)=\frac{1}{m}\sum_{i=1}^m(-y.*log(h(\theta))+(1-y).*log(1-h(\theta))) J(θ)=m1i=1∑m(−y.∗log(h(θ))+(1−y).∗log(1−h(θ)))
偏导数
∂ J ( θ ) ∂ θ = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) ∗ x ( i ) = 1 m ∑ i = 1 m ( X ′ ∗ ( h ( θ ) − y ) ) \frac{\partial J(\theta)}{\partial \theta}=\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})*x^{(i)}=\frac{1}{m}\sum_{i=1}^m(X'*(h(\theta)-y)) ∂θ∂J(θ)=m1i=1∑m(hθ(x(i))−y(i))∗x(i)=m1i=1∑m(X′∗(h(θ)−y))
其中,
X m ∗ n = [ 1 x 1 1 x 2 1 ⋯ x n 1 1 x 1 2 x 2 2 ⋯ x n 2 ⋮ ⋮ ⋮ ⋱ ⋮ 1 x 1 m x 2 m ⋯ x n m ] θ n ∗ 1 = [ θ 0 θ 1 θ 2 ⋮ θ n ] y m ∗ 1 = [ y 1 y 2 y 3 ⋮ y m ] X_{m*n}= \begin{bmatrix} 1 & x_1^1 & x_2^1 & \cdots & x_n^1 \\ 1 & x_1^2 & x_2^2 & \cdots &x_n^2\\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_1^m & x_2^m & \cdots &x_n^m \\ \end{bmatrix} \theta_{n*1}=\begin{bmatrix} \theta_0\\ \theta_1\\ \theta_2\\ \vdots\\ \theta_n\\ \end{bmatrix} y_{m*1}=\begin{bmatrix} y^1\\ y^2\\ y^3\\ \vdots\\ y^m\\ \end{bmatrix} Xm∗n=⎣⎢⎢⎢⎡11⋮1x11x12⋮x1mx21x22⋮x2m⋯⋯⋱⋯xn1xn2⋮xnm⎦⎥⎥⎥⎤θn∗1=⎣⎢⎢⎢⎢⎢⎡θ0θ1θ2⋮θn⎦⎥⎥⎥⎥⎥⎤ym∗1=⎣⎢⎢⎢⎢⎢⎡y1y2y3⋮ym⎦⎥⎥⎥⎥⎥⎤
在本问题中,则为:
X = [ 1 10 1 20 1 100 1 50 ⋯ ⋯ ] θ n ∗ 1 = [ θ 0 θ 1 θ 2 ⋮ θ n ] y m ∗ 1 = [ 0 0 1 0 ⋮ ] X=\begin{bmatrix} 1 & 10 \\ 1 & 20 \\ 1 &100 \\ 1& 50 \\ \cdots & \cdots \\ \end{bmatrix} \theta_{n*1}=\begin{bmatrix} \theta_0\\ \theta_1\\ \theta_2\\ \vdots\\ \theta_n\\ \end{bmatrix} y_{m*1}=\begin{bmatrix} 0\\ 0\\ 1\\ 0\\ \vdots\\ \end{bmatrix} X=⎣⎢⎢⎢⎢⎡1111⋯102010050⋯⎦⎥⎥⎥⎥⎤θn∗1=⎣⎢⎢⎢⎢⎢⎡θ0θ1θ2⋮θn⎦⎥⎥⎥⎥⎥⎤ym∗1=⎣⎢⎢⎢⎢⎢⎡0010⋮⎦⎥⎥⎥⎥⎥⎤
注意问题
:
- 边界问题
y = { 1 h ( θ ) ≥ 0.5 − − > X ∗ θ ≥ 0 h ( θ ) < 0.5 − − > X ∗ θ < 0 y=\begin{cases}1&h(\theta)\ge0.5 -->X*\theta \ge0 \\ &h(\theta)\lt0.5 --> X*\theta \lt0 \\\end{cases} y={1h(θ)≥0.5−−>X∗θ≥0h(θ)<0.5−−>X∗θ<0
y = { X ∗ θ ≥ 0 − − > θ 0 ∗ x 0 + θ 1 ∗ x 1 ≥ 0 X ∗ θ < 0 − − > θ 0 ∗ x 0 + θ 1 ∗ x 1 < 0 y=\begin{cases}X*\theta \ge0 --> \theta_0*x_0+\theta_1*x_1 \ge 0\\ X*\theta \lt0--> \theta_0*x_0+\theta_1*x_1 \lt 0 \\\end{cases} y={X∗θ≥0−−>θ0∗x0+θ1∗x1≥0X∗θ<0−−>θ0∗x0+θ1∗x1<0
由此可以解出一条直线方程,在直线两侧,分别表示y=1和y=0的区域
- 多项式拟合
θ 0 ∗ x 0 + θ 1 ∗ x 1 + . . . + θ n ∗ x n \theta_0*x_0+\theta_1*x_1+...+\theta_n*x_n θ0∗x0+θ1∗x1+...+θn∗xn
θ 0 ∗ x 0 + θ 1 ∗ x 1 2 + . . . + θ n ∗ x n 2 \theta_0*x_0+\theta_1*x_1^2+...+\theta_n*x_n^2 θ0∗x0+θ1∗x12+...+θn∗xn2
θ 0 ∗ x 0 + θ 1 ∗ x 1 + . . . + θ n ∗ x n 2 \theta_0*x_0+\theta_1*\sqrt{x_1}+...+\theta_n*x_n^2 θ0∗x0+θ1∗x1+...+θn∗xn2
可以多项式拟合,不一定要直线
解决方法
:
可以尝试已有的不同算法解决最小化问题,包括梯度下降方法。
只需要提供如果计算成本函数和其偏导数代码
再通过调用已经算法函数,就可以算出最终的参数
θ
\theta
θ值
程序实现
简单思路
:
- 从原始数据提取X,Y,构造 θ \theta θ,得到样本数m和特征值n
- 缩放比例,归一化函数
- sigmoid函数, 成本函数和算偏导数函数
- 调用其他优化算法,得到最终的 θ \theta θ向量
python代码实现
这里只展示了sigmoid函数,计算成本函数和偏导数函数;掌握重点的语句即可。
import numpy as np
def sigmoid(z):
return 1/(1+np.exp(-z))
def computeCost(X,y,theta):#成本函数
m=X.shape[0]
h=sigmoid(X@theta)
J=np.mean(-y*log(h)+(1-y)*log(h))
#或者J=(np.sum(-y*log(h)+(1-y)*log(h)))/m
return J
def gradient(X,y,theta):#导数
m=X.shape[0]
h=sigmoid(X@theta)
grad=1/m*(X.T@(h-y))
return grad
注意
:
在python中,我们通常认为的矩阵乘法用@或者dot函数表示,而*则表示元素相乘。
总结
矩阵化表达(数学公式)及对应的关键程序语句
参考
[1] 来自本课程课件和作业题,以及黄海广github上的中文笔记资料等