逻辑回归(Logistics Regression)的原理及实现 | 您所在的位置:网站首页 › sigmoid函数用于什么问题 › 逻辑回归(Logistics Regression)的原理及实现 |
1.逻辑回归(Logistics Regression)的原理及实现
笔记来源于《白话机器学习的数学》 逻辑回归用于解决二分类问题 1.1 逻辑回归的原理 1.1.1 Sigmoid函数sigmoid函数在神经网络中如何起作用?详见本人笔记:机器学习和AI底层逻辑 复杂非线性分类->多个线段->每个线段是叠加而来的->sigmoid函数作为小线段的来源->不同的sigmoid可以叠加成任意形状的小线段,多个小线段拼接得到最终复杂分类的线段->这个过程用抽象的方法表达(神经网络) sigmoid函数将数据 x \boldsymbol{x} x映射到 [ 0 , 1 ] [0,1] [0,1],概率范围刚好也是 [ 0 , 1 ] [0,1] [0,1],可以用概率大小与阈值比较来判断数据属于哪个类别
若 θ T x < 0 \boldsymbol{\theta}^{T}\boldsymbol{x}\lt 0 θTx0,则 f θ ( x ) > 0.5 f_{\boldsymbol{\theta}}(\boldsymbol{x})\gt0.5 fθ(x)>0.5, f θ ( x ) = P ( y = 1 ∣ x ) f_{\boldsymbol{\theta}}(\boldsymbol{x})=P(y=1|\boldsymbol{x}) fθ(x)=P(y=1∣x)(数据属于分类1的概率),概率在 [ 0.5 , 1 ] [0.5,1] [0.5,1]范围,则数据判别为属于分类1 ![]() ![]() 通过训练调整参数达到最优结果 1.1.2 似然函数对于二分类的情况,标签y的取值只有0、1,满足
P
(
y
=
0
∣
x
)
+
P
(
y
=
1
∣
x
)
=
1
P(y=0|\boldsymbol{x})+P(y=1|\boldsymbol{x})=1
P(y=0∣x)+P(y=1∣x)=1 数据与标签的理想关系 标签
y
=
0
y=0
y=0 时,我们希望数据为标签0的概率
f
θ
(
x
)
=
P
(
y
=
0
∣
x
)
f_{\boldsymbol{\theta}}(\boldsymbol{x})=P(y=0|\boldsymbol{x})
fθ(x)=P(y=0∣x)最大 标签
y
=
1
y=1
y=1 时,我们希望数据为标签1的概率
f
θ
(
x
)
=
P
(
y
=
1
∣
x
)
f_{\boldsymbol{\theta}}(\boldsymbol{x})=P(y=1|\boldsymbol{x})
fθ(x)=P(y=1∣x)最大 所有训练数据中的每个数据取到正确标签的概率乘积起来就是所有数据取到正确标签的概率(联合概率),即逻辑回归的目标函数/代价函数:似然函数 最大化似然估计求似然函数的极大值,进而得到参数估计值,求代价函数的最小值就是对似然函数的极大化 下面我们求似然函数的最大值
输入图像水平方向和竖直方向的像素,判断该图像是纵向的还是横向的? ![]() ![]()
x
1
x1
x1为水平方向像素、
x
2
x2
x2为竖直方向像素、
y
y
y为标签,
y
=
0
y=0
y=0代表该图像为纵向的,
y
=
1
y=1
y=1代表该图像为横向的 对变量进行标准化,求出变量x所有数值的均值和标准差,利用下式对所有数值进行标准化 def standardize(x): return (x - mu) / sigma train_z = standardize(train_x) # 增加 x0 def to_matrix(x): x0 = np.ones([x.shape[0], 1]) return np.hstack([x0, x]) X = to_matrix(train_z)将标准化的训练数据绘图 plt.plot(train_z[train_y == 1, 0], train_z[train_y == 1, 1], 'o') plt.plot(train_z[train_y == 0, 0], train_z[train_y == 0, 1], 'x') plt.show()线性可分类数据 我们把重复次数 epoch 设置得稍微多一点,比如 5000 次左右。在实际问题中需要通过反复尝试来设置这个值,即通过确认学习中的精度来确定重复多少次才足够好 # 重复学习 for _ in range(epoch): theta = theta - ETA * np.dot(f(X) - train_y, X) # 日志输出 count += 1 print('第 {} 次 : theta = {}'.format(count, theta))下式为参数更新表达式,上述循环体中的表达式为下式的矩阵形式 学习完成后得到参数的最优结果,将这些参数的最优结果代入分类边界表达式
使用分类函数验证预测结果
x
1
x1
x1为水平方向像素、
x
2
x2
x2为竖直方向像素、
y
y
y为标签,
y
=
0
y=0
y=0代表该图像为纵向的,
y
=
1
y=1
y=1代表该图像为横向的
我们把重复次数 epoch 设置得稍微多一点,比如 5000 次左右。在实际问题中需要通过反复尝试来设置这个值,即通过确认学习中的精度来确定重复多少次才足够好 # 重复学习 for _ in range(epoch): theta = theta - ETA * np.dot(f(X) - train_y, X) # 日志输出 count += 1 print('第 {} 次 : theta = {}'.format(count, theta))下式为参数更新表达式,上述循环体中的表达式为下式的矩阵形式 迭代结果
x
1
x1
x1为横轴、
x
2
x2
x2为纵轴 验证一下模型,以迭代次数为横轴,精度为纵轴绘图 # 参数初始化 theta = np.random.rand(4) # 精度的历史记录 accuracies = [] # 重复学习 for _ in range(epoch): theta = theta - ETA * np.dot(f(X) - train_y, X) # 计算现在的精度 result = classify(X) == train_y accuracy = len(result[result == True]) / len(result) # 模型评估指标:精度 accuracies.append(accuracy)观察下图,随着迭代次数的增加,精度越来越逼近1,迭代次数在900次时,精度基本达到1,所以迭代次数 epoch 可以设置为1000左右 |
CopyRight 2018-2019 实验室设备网 版权所有 |