提出问题
二分类问题
图像的宽x,高y,根据x和y的大小,将图像分为横向图片和纵向图片
宽x | 高y | 形状label |
---|---|---|
80 | 150 | 纵向 |
60 | 110 | 纵向 |
35 | 130 | 纵向 |
160 | 50 | 横向 |
160 | 20 | 横向 |
125 | 30 | 横向 |
逻辑回归-概率分类
sigmoid函数
sigmoid函数的由来
几率 :事件发生的概率除以未发生的概率 ,设p为事件发生的概率,则(1-p)为事件未发生的概率。此时:
定义域:;值域:
将上式取对数,可以将其扩展到实数空间 ,就是logit函数 :
定义域:;值域:
由于logit函数和线性回归模型在同一取值范围内,因此,可以用线性回归模型来表示logit函数:
令
则:
对上式等号两边取e:
至此,得到了sigmod函数,用来将线性回归模型 输出的实数空间取值映射成为概率 。
sigmoid函数的一般表达式如下:
sigmoid函数图像
sigmoid函数性质
定义域:
值域:
sigmoid导数性质
sigmoid函数的优势:
1. 引入了非线性映射,将线性回归的值域映射到(0, 1)之间,符合概率值区间[0, 1]
2. 大于0.5表示阳性,小于0.5表示阴性,有助于直观地做出预测类型的判断
3. 数学特性好,便于求导
借助sigmoid函数,生成逻辑回归模型表达式 为:
其中:
该式表现为多元线性回归(含有n个参数)的模式。这也是逻辑回归中,回归二字的来源。
因为 ,因此,上式可以作为概率来使用。
决策边界
定义概率计算式为:
该式含义:已知数据的条件下,
的概率为
。假设计算得到
,则说明数据
对应的类别
是
的概率为0.8
分类标准如下:(1:横向;0:纵向)
根据逻辑回归模型表达式的定义,上式可改写为
将分类条件改为这种写法的意义在于:将作为分类边界 ,实现二分类的目的。
决策边界:用于数据分类的直线称为决策边界。上述讨论中的 就是逻辑回归模型的决策边界。
为了获得合理的决策边界,即求得正确的参数,需要定义目标函数 ,进行微分,获得参数更新表达式 ,然后利用现有数据,不断更新
来得到正确的决策边界。该过程即为逻辑回归模型。
似然函数(目标函数)
按照前述分析:
- 当y=1时,我们希望概率
是最大的
- 当y=0时,我们希望概率
是最大的
对于全部示例数据,有如下信息:
图像大小 | 形状label | 概率 | |||
---|---|---|---|---|---|
80 x 150 | 纵向 | 80 | 150 | 0 | 期待 |
60 x 110 | 纵向 | 60 | 110 | 0 | 期待 |
35 x 130 | 纵向 | 35 | 130 | 0 | 期待 |
160 x 50 | 横向 | 160 | 50 | 1 | 期待 |
160 x 20 | 横向 | 160 | 20 | 1 | 期待 |
125 x 30 | 横向 | 125 | 30 | 1 | 期待 |
假定所有的训练数据都互不影响、独立发生。这样的话,整体的概率可用下面的联合概率来表示:
更一般化的写法如下:
关键点:这个表达式利用了任何数的0次方都是1的特性。结合二分类的类别分别取0和1,得到所有样本概率乘积的统一表达式。
:表示共有m个样本。
这里的目标函数也被称为似然 ,L 取自似然的英文单词Likelihood
回归的时候,处理的是误差,因此需要使误差最小化。
现在考虑的是联合概率,我们希望概率尽可能大,所以更新参数的目标是使得概率尽可能大。
对数似然函数
上述目标函数(似然函数)直接求微分比较困难,是因为:(取对数的原因)
1. 联合概率都是小于1的,其乘积会更小,若值太小,编程时会出现精度问题
2. 乘法相比于加法,计算量要大很多
因此需要在微分前,对函数进行变形,即:取似然函数的对数
取对数的可行性:对数函数是单调递增的,要获取 的最大值,即获取
的最大值
对式(1)取自然对数,得到对数似然函数如下所示:
综上:逻辑回归使用如下的对数似然函数作为目标函数:
逻辑回归参数学习更新的算法通常为梯度下降法 和拟牛顿法 ,这里采用梯度下降法,求导过程如下:
针对参数,对上式两边求偏导如下:
其中:
:第
个样本
:第
个参数
参数更新表达式如下所示:
因为要使似然函数最大化,因此,参数 应该向似然函数增大的方向移动 ,即:
的移动方向应该与微分符号一致 ,因此上式中使用加号"+"
:第j个参数,共有n个参数
:学习率 ,超参数
:样本的个数
线性不可分问题
通过构造合理的,即构造不同形状的决策边界曲线
,使用逻辑回归模型,即可处理线性不可分问题,示例如下
上图中,这两类无法用一条直线来区分,可以寻找一条曲线来作为决策边界,来解决这个线性不可分问题。如下图所示
根据逻辑回归模型中参数更新的方式,使用样本进行训练,不断更新参数,就可以得到合理的决策边界,进而完成线性不可分问题的分类。
逻辑回归示例
现有数据集data3.csv,如下所示:
划分数据集,并做图如下
# 划分数据
train = df.values
train_x = train[:,:2]
train_y = train[:,-1]
# 作图观察数据
df0 = df[df['y'] == 0]
df1 = df[df['y'] == 1]
plt.figure(dpi=150)
plt.plot(df0['x1'], df0['x2'], 'x', label='class 0')
plt.plot(df1['x1'], df1['x2'], 'o', label='class 1')
plt.legend()
plt.show()
根据图像观察样本点分布位置,初步猜测决策边界为二次函数,如下所示:
据此,共4个参数,则输入数据X应该具有4列,如下所示
# 构造输入矩阵X
X = np.c_[np.ones(len(train_x)), train_x, train_x[:,0]**2]
# 随机初始化4个参数
theta = np.random.rand(4)
根据参数更新表达式,迭代更新参数
# 定义模型表达式
def f(X):
z = np.dot(X, theta)
return 1 / (1 + np.exp(-z))
# 设定学习率为0.001
ETA = 0.001
# 设置更新次数为5000
epoch = 5000
# 开始迭代更新
for i in range(epoch):
theta = theta + ETA * np.dot(train_y-f(X), X)
根据决策边界:
计算得到,决策边界曲线为:
作图查看分类结果
# 作图查看分类结果
df0 = df[df['y'] == 0]
df1 = df[df['y'] == 1]
x1 = np.linspace(-3, 5, 100)
x2 = -(theta[0] + theta[1] * x1 + theta[3]*x1**2) / theta[2]
plt.figure(dpi=100)
plt.plot(df0['x1'], df0['x2'], 'x', label='class 0')
plt.plot(df1['x1'], df1['x2'], 'o', label='class 1')
plt.plot(x1, x2, '--')
plt.legend()
plt.show()
参考内容:《白话机器学习的数学》[日]立石贤吾
文中数据:https://zlzsm.lanzoui.com/iSMCSu5wkzc