楼主: Dear_Li
1531 0

[程序分享] 数学推导+纯Python实现机器学习算法:逻辑回归 [推广有奖]

  • 0关注
  • 14粉丝

等待验证会员

博士生

64%

还不是VIP/贵宾

-

威望
0
论坛币
686 个
通用积分
7.6246
学术水平
12 点
热心指数
16 点
信用等级
2 点
经验
4905 点
帖子
186
精华
0
在线时间
246 小时
注册时间
2018-7-21
最后登录
2019-1-16

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

自本系列第一讲推出以来,得到了不少同学的反响和赞成,也有同学留言说最好能把数学推导部分写的详细点,笔者只能说尽力,因为打公式实在是太浪费时间了。。本节要和大家一起学习的是逻辑(logistic)回归模型,继续按照手推公式+纯 Python 的写作套路。

逻辑回归本质上跟逻辑这个词不是很搭边,叫这个名字完全是直译过来形成的。那该怎么叫呢?其实逻辑回归本名应该叫对数几率回归,是线性回归的一种推广,所以我们在统计学上也称之为广义线性模型。众多周知的是,线性回归针对的是标签为连续值的机器学习任务,那如果我们想用线性模型来做分类任何可行吗?答案当然是肯定的。



sigmoid 函数

相较于线性回归的因变量 y 为连续值,逻辑回归的因变量则是一个 0/1 的二分类值,这就需要我们建立一种映射将原先的实值转化为 0/1 值。这时候就要请出我们熟悉的 sigmoid 函数了:

其函数图形如下:


除了长的很优雅之外,sigmoid 函数还有一个很好的特性就是其求导计算等于下式,这给我们后续求交叉熵损失的梯度时提供了很大便利。


逻辑回归模型的数学推导

由 sigmoid 函数可知逻辑回归模型的基本形式为:

稍微对上式做一下转换:



下面将 y 视为类后验概率 p(y = 1 | x),则上式可以写为:

则有:


    将上式进行简单综合,可写成如下形式:


写成对数形式就是我们熟知的交叉熵损失函数了,这也是交叉熵损失的推导由来:


最优化上式子本质上就是我们统计上所说的求其极大似然估计,可基于上式分别关于 W 和b 求其偏导可得:

基于 W 和 b 的梯度进行权值更新即可求导参数的最优值,使得损失函数最小化,也即求得参数的极大似然估计,殊途同归啊。



逻辑回归的 Python 实现

跟上一讲写线性模型一样,在实际动手写之前我们需要理清楚思路。要写一个完整的逻辑回归模型我们需要:sigmoid函数、模型主体、参数初始化、基于梯度下降的参数更新训练、数据测试与可视化展示。

先定义一个 sigmoid 函数:

  1. import numpy as np
  2. def sigmoid(x):
  3.     z = 1 / (1 + np.exp(-x))   
  4.     return z
复制代码


定义模型参数初始化函数:

  1. def initialize_params(dims):
  2.     W = np.zeros((dims, 1))
  3.     b = 0
  4.     return W, b
复制代码


定义逻辑回归模型主体部分,包括模型计算公式、损失函数和参数的梯度公式:

  1. def logistic(X, y, W, b):
  2.     num_train = X.shape[0]
  3.     num_feature = X.shape[1]

  4.     a = sigmoid(np.dot(X, W) + b)
  5.     cost = -1/num_train * np.sum(y*np.log(a) + (1-y)*np.log(1-a))

  6.     dW = np.dot(X.T, (a-y))/num_train
  7.     db = np.sum(a-y)/num_train
  8.     cost = np.squeeze(cost)

  9.     return a, cost, dW, db
复制代码


定义基于梯度下降的参数更新训练过程:

  1. def logistic_train(X, y, learning_rate, epochs):   
  2.     # 初始化模型参数
  3.     W, b = initialize_params(X.shape[1])  
  4.     cost_list = []  

  5.     # 迭代训练
  6.     for i in range(epochs):      
  7.         # 计算当前次的模型计算结果、损失和参数梯度
  8.         a, cost, dW, db = logistic(X, y, W, b)   
  9.         # 参数更新
  10.         W = W -learning_rate * dW
  11.         b = b -learning_rate * db        

  12.         # 记录损失
  13.         if i % 100 == 0:
  14.             cost_list.append(cost)   
  15.         # 打印训练过程中的损失
  16.         if i % 100 == 0:
  17.             print('epoch %d cost %f' % (i, cost))

  18.     # 保存参数
  19.     params = {            
  20.         'W': W,            
  21.         'b': b
  22.     }        
  23.     # 保存梯度
  24.     grads = {            
  25.         'dW': dW,            
  26.         'db': db
  27.     }           
  28.     return cost_list, params, grads
复制代码


定义对测试数据的预测函数:

  1. def predict(X, params):
  2.     y_prediction = sigmoid(np.dot(X, params['W']) + params['b'])
  3.     for i in range(len(y_prediction)):        
  4.         if y_prediction[i] > 0.5:
  5.             y_prediction[i] = 1
  6.         else:
  7.             y_prediction[i] = 0
  8.     return y_prediction
复制代码


使用 sklearn 生成模拟的二分类数据集进行模型训练和测试:

  1. import matplotlib.pyplot as plt
  2. from sklearn.datasets.samples_generator import make_classification
  3. X,labels=make_classification(n_samples=100, n_features=2, n_redundant=0, n_informative=2, random_state=1, n_clusters_per_class=2)
  4. rng=np.random.RandomState(2)
  5. X+=2*rng.uniform(size=X.shape)

  6. unique_lables=set(labels)
  7. colors=plt.cm.Spectral(np.linspace(0, 1, len(unique_lables)))
  8. for k, col in zip(unique_lables, colors):
  9.     x_k=X[labels==k]
  10.     plt.plot(x_k[:, 0], x_k[:, 1], 'o', markerfacecolor=col, markeredgecolor="k",
  11.              markersize=14)
  12. plt.title('data by make_classification()')
  13. plt.show()
复制代码


数据分布展示如下:





参考资料:

周志华 机器学习



字数限制可查看原文:https://blog.csdn.net/weixin_42633269/article/details/83035930



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Python 数学推导 机器学习 逻辑回归

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 08:40