逻辑回归及其python实现
二. 逻辑回归及其python实现
- 1. 二分类逻辑回归
- (1). 交叉熵损失函数
- (2). 交叉熵损失函数原理推导
- (3). 梯度下降
- (i). 偏导
- (ii). 参数更新
- 2. 多元逻辑回归
- (1). softmax 多元逻辑回归
- (2). 损失函数
- 3. python 实现
- 1. 一个实例:手写数字识别
- 2. 结果
1. 二分类逻辑回归
z = x ⃗ w ⃗ = w 0 + w 1 x 1 + w 2 x 2 + . . . + w n x n y = h w ( x ) = s i g m o i d ( z ) = 1 1 + e − z z= \vec{x}\vec{w} = w_0 + w_1x_1 +w_2x_2 + ... +w_nx_n\\ y=h_w(x)=sigmoid(z)=\frac{1}{1+e^{-z}} z=x w =w0+w1x1+w2x2+...+wnxny=hw(x)=sigmoid(z)=1+e−z1
(1). 交叉熵损失函数
J ( w ) = − 1 m ∑ i = 1 m [ y ( i ) l o g ( y ^ ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ] J(w) = -\frac{1}{m}\sum_{i=1}^m{[y^{(i)}log(\widehat{y}^{(i)}) + (1-y^{(i)})log(1-\widehat{y}^{(i)})]} J(w)=−m1i=1∑m[y(i)log(y (i))+(1−y(i))log(1−y (i))]
(2). 交叉熵损失函数原理推导
交叉熵损失函数的本质是等价于极大似然估计,已知:
P ( y = 1 ∣ x , w ) = h w ( x ) P ( y − 0 ∣ x , w ) = 1 − h w ( x ) P(y=1|x, w) = h_w(x)\\ P(y-0 |x, w) = 1 - h_w(x) P(y=1∣x,w)=hw(x)P(y−0∣x,w)=1−hw(x)
因此
P ( y ∣ x , w ) = h w ( x ) y ( 1 − h w ( x ) ) 1 − y P(y|x, w) = h_w(x)^y(1-h_w(x))^{1-y} P(y∣x,w)=hw(x)y(1−hw(x))1−y
极大似然函数
L ( w ) = ∏ i = 1 m h w ( x ( i ) ) y ( i ) ( 1 − h w ( x ( i ) ) ) 1 − y ( i ) L(w) = \prod_{i=1}^m{h_w(x^{(i)})^{y^{(i)}}(1-h_w(x^{(i)}))^{1-y^{(i)}}} L(w)=i=1∏mhw(x(i))y(i)(1−hw(x(i)))1−y(i)
对极大似然函数取对数然后取反,即得交叉熵损失函数(为了样本规模影响loss大小,损失函数除以了m),因此最小化交叉熵损失函数等价于最大化极大似然函数
(3). 梯度下降
(i). 偏导
∂ J ∂ w = 1 m ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) x ( i ) = 1 m X T ( h w ( X ) − y ⃗ ) \frac{\partial{J}}{\partial{w}} = \frac{1}{m}\sum_{i=1}^m{(\widehat{y}^{(i)}-y^{(i)})x^{(i)}}=\frac{1}{m}X^T(h_w(X) - \vec{y}) ∂w∂J=m1i=1∑m(y (i)−y(i))x(i)=m1XT(hw(X)−y )
(ii). 参数更新
w = w − α ∗ ∂ J ∂ w w = w -\alpha * \frac{\partial{J}}{\partial{w}} w=w−α∗∂w∂J
2. 多元逻辑回归
- one vs rest 考虑某种类型为正值1,其余全为0,训练K个logistic分类器,适合K个类型不互斥的情况
- one vs one: 选择一个类别和另一个类别训练分类器, softmax 多元逻辑回归
(1). softmax 多元逻辑回归
P ( y = k ∣ x , w ) = e x w k ∑ t = 1 K e x w t P(y=k|x, w)=\frac{e^{xw_k}}{\sum_{t=1}^Ke^{xw_t}} P(y=k∣x,w)=∑t=1Kexwtexwk
其中 w K ∗ n w_{K*n} wK∗n
(2). 损失函数
J ( w ) = − ∑ i = 1 m ∑ t = 1 K 1 y = j l o g ( P ( y = t ∣ x , w ) ) J(w) = -\sum_{i=1}^m{\sum_{t=1}^K{1_{y=j}log(P(y=t|x, w))}} J(w)=−i=1∑mt=1∑K1y=jlog(P(y=t∣x,w))
3. python 实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasetsdef sigmoid(z):return (1/(1+np.exp(-z)))def model(X, theta):"""X array(m * n)theta array(n * 1)return : array (m * 1)"""return sigmoid(X @ theta)def computerCost(X, y, theta):"""X: array(m * n)y: array(m * 1)theta: array(n * 1)"""y_pred = model(X, theta)m = X.shape[0]J = (-1/m) * (y.T @ np.log(y_pred) +(1-y.T) @ np.log(1-y_pred))return np.squeeze(J)def gradientDescent(X, y, theta, alpha, num_iters):'''X: array(m * n)y: array(m * 1)theta: array(n * 1)alpha: learning rate between (0, 1)num_iters: number of iteration timesn should be the feature number plus 1'''J_history = np.empty((num_iters, 1))for i in range(num_iters):theta = theta - alpha * (1/m * (X.T @ (model(X, theta) - y)))J_history[i] = computerCost(X, y, theta)print('.', end='')return theta, J_history# 多元分类
def one_vs_all(X, y, k, theta, alpha, num_iters):J_history = np.empty((k, num_iters, 1))# 训练k个分类器for i in range(k):y_k = (y==i)theta_k = theta[:, i]theta_k = theta_k[:, np.newaxis]theta_k, J_history[i, :, :] = gradientDescent(X, y_k, theta_k, alpha, num_iters)theta[:, i] = np.squeeze(theta_k)print('\n**************\n')return theta, J_historydef predict(X, theta):y_pred = model(X, theta)y_type = np.argmax(y_pred, axis=1)return y_type[:, np.newaxis]
1. 一个实例:手写数字识别
digits = datasets.load_digits()
X = digits.data
y = digits.target
m = len(y)
n = X.shape[1] + 1
X_adjust = np.hstack((np.ones((m, 1)), X))
y = np.expand_dims(y, axis=1)k = 10
alpha = 0.1
num_iters = 100
theta = np.random.random((n, k))theta, J_history = one_vs_all(X_adjust, y, k, theta, alpha, num_iters)# 随意选择一个数据观察预测值和真实值,并可视化该手写数字灰度图
pick_index = 268
x = X[pick_index, :]
x_adjust = np.expand_dims(x, axis=0)
x_adjust = np.hstack((np.ones((1, 1)), x_adjust))
y_pred = predict(x_adjust, theta)
plt.imshow(digits.images[pick_index], cmap='gray')
print("predict number:\n", y_pred)
print("true number:\n", y[pick_index])# 计算准确率
y_pred = predict(X_adjust, theta)
accuracy = np.sum((y_pred == y)) / len(y)
print(accuracy)
2. 结果
逻辑回归及其python实现相关推荐
- 【ML/DL】逻辑回归模型Python实现
逻辑回归模型python实现 文章目录 逻辑回归模型python实现 注: 0.理论知识 逻辑回归模型 计算公式 1.导入需要的包 lr_utils.py 2. 导入数据集 查看数据集shape 查看 ...
- 数学建模——逻辑回归模型Python代码
数学建模--逻辑回归模型详解Python代码 程序用到的测试数据: 链接:https://pan.baidu.com/s/1LGD1MAxk2lxO93smSPNyZg 提取码:uukr 代码正文 i ...
- 机器学习(三)逻辑回归以及python简单实现
虽然有回归两个字,但是依然是解决的时分类问题,是最经典的二分类算法. 分类算法有很多,例如支持向量机和神经网络.而逻辑回归算法应用的比较广,往往是优先选择的算法. Sigmod函数 表达式: g(z) ...
- python逻辑回归代码_Logistic 逻辑回归及 python 实现
1. 引言 2. 数例 3. logistic 函数原理 4. 极大似然估计求出参数值 5. python 代码 1. 引言 Logistic 逻辑回归比较适合分类型因变量的回归,这种问题在现实中很多 ...
- 吴恩达机器学习作业2:逻辑回归(Python实现)
逻辑回归 在训练的初始阶段,将要构建一个逻辑回归模型来预测,某个学生是否被大学录取.设想你是大学相关部分的管理者,想通过申请学生两次测试的评分,来决定他们是否被录取.现在你拥有之前申请学生的可以用于训 ...
- 多分类逻辑回归 MNLogit python
多分类逻辑回归MNLogit 引言 实例及python实现 数据集 查看数据情况 Logistics回归 输出结果 模型评价 Precision.Recall.f1_score ROC曲线及AUC 混 ...
- 逻辑斯蒂回归(逻辑回归)Python简单实现(算法笔试)
Python代码简单实现逻辑回归 之所以说是简单,是因为我们只考虑一维的特征. 实现的关键步骤是 1.根据输入样本计算预测输出y 2.根据标签y'和预测输出y求梯度 3.梯度更新参数 实现代码如下 i ...
- 逻辑回归分类python实例_Python逻辑回归原理及实际案例应用
前言 目录 1. 逻辑回归 2. 优缺点及优化问题 3. 实际案例应用 4. 总结 正文 在前面所介绍的线性回归, 岭回归和Lasso回归这三种回归模型中, 其输出变量均为连续型, 比如常见的线性回归 ...
- 【吴恩达】机器学习作业 ex3data1 -- 多分类逻辑回归(Python)
一.前言 本次是多分类逻辑回归的代码,主题是让你预测5000个手写数字对应的真正数字,每张图片有400个特征值,可以用20*20的方阵表示出来,一共5000行数据,此次的数据集是.mat类型,和以往的 ...
最新文章
- LeetCode简单题之二分查找
- AtCoder Petrozavodsk Contest 001
- 做了个第三方NTFS软RAID
- Bootstrap入门(十三)组件7:导航条
- LeetCode刷题(46)--Search in Rotated Array
- mysql 5.7 plugin 安装_mysql5.7以上版本安装
- 云计算-大数据-云安全高等教育改革示范教材
- 微信开发-UnionID机制相关文档
- 读《Linux运维之道》有感
- SmartUpload问题
- 浅谈 Lempel-Ziv压缩方法
- 没有鸿蒙HarmonyOS,用这个软件也可以实现华为的多屏协助互动!
- python爬取小说并下载_python3爬取小说存为文本实现小说下载
- 我是怎么做到开源系统的角色权限功能的?
- @refreshscope注解
- 2021年上半年全球首席执行官任命达到创纪录水平,女性首席执行官翻了一番|美通社头条...
- 外贸客户如何选择供应商:5R原则
- mysql list dbs_关于mysql_list_dbs()函数的10篇文章推荐
- Microsoft 账户已购买 office ,之前用的好好的 office 突然显示未经授权不能编辑文件怎么办?
- 程序代码中常用英文单词使用总结
热门文章
- 学籍管理系统java_学籍管理系统(Java初级版)
- 1W存一年和两个5000存一年,收益有区别吗?
- There are no devices registered in your account on the developer website
- 开源中国源码学习(四)——主界面总体认识
- 利用cmd代码一次性提取电脑登陆过的wifi密码到桌面
- linux里怎么看终端类型,如何区分Linux下的几种终端类型:tty、pty和pts
- javaScript 原型 和 原型链
- 人工智能之深度学习常见应用方向你都了解吗?(文末包邮送书5本)
- iview render函数(vue render函数)
- 在windows下编译Botan