今天带来第三周课程的笔记:梯度下降与正规方程。
主要讲解的内容包含:
- 逻辑回归
- 代价函数
- 线性回归和逻辑回归的比较
- 正则化问题
逻辑回归
分类问题
假设预测的变量y是离散的值,需要使用逻辑回归Logistic Regression,LR的算法,实际上它是一种分类算法
二元分类问题
将因变量dependent variable可能属于的两个类分别称为负向类negative class和正向类positive class,因变量y的取值只能在0和1之间,其中0表示负类,1表示正类
假说表示Hypothesis Representation
分类器的输出值在0和1之间,因此,希望找出一个满足某个性质的假设函数,这个性质是它的预测值要在0和1之间
例如:对于给定的x,通过已经确定的参数计算得出hθ(x)=0.7hθ(x)=0.7,则表示有70%的几率y属于正类
决策边界decision boundary
解释逻辑回归
- 在逻辑回归中h≥0.5h≥0.5预测y=1y=1;反之y=0
- 在激活函数g(z)g(z)中:
当z≥0z≥0则g(z)≥0.5g(z)≥0.5
当z<0z<0则g(z)<0.5g(z)<0.5
又因为 z=θTx ,即: θTx>=0 时,预测 y=1y=1 ;反之:θTx<0 时,预测 y=0
实例demo
在下图的中实例中,参数θ满足[-3,1,1],当−3+x1+x2≥0,即x1+x2≥3时,模型预测y=1;说明此时:直线x1+x2=3就是决策边界
复杂的模型边界问题
代价函数Cost Function
如何拟合LR模型的参数θ
Python代码实现代价函数
利用Python实现下面的代价函数
- first 表示的是右边第一项
- second 表示的是右边第二项
import numpy as np def cost(theta, X, y): # 实现代价函数 theta=np.matrix(theta) X = np.matrix(X) y = np.matrxi(y) first = np.multiply(-y, np.log(sigmod(X * theta.T))) second = np.multiply((1 - y), np.log(1-sigmod(X * theta.T))) return np.sum(first - second) / (len(X))
线性回归 VS 逻辑回归
- 假设的定义规则发生变化
线性回归:
逻辑回归:
因此,即使更新参数的规则看起来基本相同,但由于假设的定义发生了变化,所以逻辑函数的梯度下降,跟线性回归的梯度下降实际上是两个完全不同的东西。
其他求解代价函数最小的算法
- 共轭梯度conjugate gradient
- 局部优化法Broyden fletcher goldfarb shann,BFGS
- 有限内存局部优化法LBFGS
多类别分类one-vs-all
我们举一个实际中的例子来说明:
假如现在需要一个学习算法能自动地将邮件归类到不同的文件夹里,或者说可以自动地加上标签,那么需要一些不同的文件夹,或者不同的标签来完成这件事,来区分开来自工作、朋友、家人或者有关兴趣爱好的邮件,那么,就有了这样一个分类问题:其类别有4个,分别用y=1,2,3,4 来代表。
正则化问题Regularization
正则化基础
正则化技术主要是为了解决过拟合的问题。过拟合指的是:对样本数据具有很好的判断能力,但是对新的数据预测能力很差。
- 第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集
- 第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据
- 中间的模型似乎最合适
如果是多项式拟合,x的次数越高,拟合的效果越好,但是相应的预测能力就可能变差。对于过拟合的处理:
- 丢弃一些不能正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法,例如PCA
- 正则化。保留所有的特征,但是减少参数的大小magnitude*
import numpy as np # 实现代价函数 def costReg(theta, X, y, lr): theta= np.matrix(theta) X = np.matrix(X) y = np.matrix(y) first = np.multiply(-y, np.log(sigmoid(X * theta.T))) second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T))) reg = (lr / (2 * len(X)) * np.sum(np.power(theta[:, 1:theta.shape[1]], 2)) # theta[:, 1:theta.shape[1]] 代表的是 \theta_j return np.sum(first - second) / len((X)) + reg
通过求导,得到梯度下降算法,本质上就是对θ的不断更新:
至此,第三周的课程笔记完毕!