首页 > 其他分享 >机器学习从入门到精通—— Logistic回归与最大熵模型

机器学习从入门到精通—— Logistic回归与最大熵模型

时间:2022-11-01 17:00:18浏览次数:71  
标签:精通 return 入门 模型 斯谛 Logistic ._ self def


Logistic回归

  • ​​Logistic回归​​
  • ​​逻辑斯谛​​
  • ​​回归模型​​
  • ​​相对应模型代码实现​​
  • ​​逻辑斯蒂​​
  • ​​最大熵模型代码实现​​

Logistic回归

逻辑斯谛

1.逻辑斯谛回归模型是由以下条件概率分布表示的分类模型。逻辑斯谛回归模型可以用于二类或多类分类。

机器学习从入门到精通—— Logistic回归与最大熵模型_最大熵

机器学习从入门到精通—— Logistic回归与最大熵模型_最大熵模型_02
这里,机器学习从入门到精通—— Logistic回归与最大熵模型_回归_03为输入特征,机器学习从入门到精通—— Logistic回归与最大熵模型_最大熵_04为特征的权值。

逻辑斯谛回归模型源自逻辑斯谛分布,其分布函数机器学习从入门到精通—— Logistic回归与最大熵模型_机器学习_05机器学习从入门到精通—— Logistic回归与最大熵模型_机器学习_06形函数。逻辑斯谛回归模型是由输入的线性函数表示的输出的对数几率模型。

2.最大熵模型是由以下条件概率分布表示的分类模型。最大熵模型也可以用于二类或多类分类。

机器学习从入门到精通—— Logistic回归与最大熵模型_最大熵_07
机器学习从入门到精通—— Logistic回归与最大熵模型_最大熵模型_08

其中,机器学习从入门到精通—— Logistic回归与最大熵模型_机器学习_09是规范化因子,机器学习从入门到精通—— Logistic回归与最大熵模型_最大熵_10为特征函数,机器学习从入门到精通—— Logistic回归与最大熵模型_机器学习_11为特征的权值。

3.最大熵模型可以由最大熵原理推导得出。最大熵原理是概率模型学习或估计的一个准则。最大熵原理认为在所有可能的概率模型(分布)的集合中,熵最大的模型是最好的模型。

最大熵原理应用到分类模型的学习中,有以下约束最优化问题:

机器学习从入门到精通—— Logistic回归与最大熵模型_机器学习_12

机器学习从入门到精通—— Logistic回归与最大熵模型_机器学习_13

机器学习从入门到精通—— Logistic回归与最大熵模型_回归_14

求解此最优化问题的对偶问题得到最大熵模型。

4.逻辑斯谛回归模型与最大熵模型都属于对数线性模型。

5.逻辑斯谛回归模型及最大熵模型学习一般采用极大似然估计,或正则化的极大似然估计。逻辑斯谛回归模型及最大熵模型学习可以形式化为无约束最优化问题。求解该最优化问题的算法有改进的迭代尺度法、梯度下降法、拟牛顿法。

回归模型

回归模型:机器学习从入门到精通—— Logistic回归与最大熵模型_机器学习_15

其中wx线性函数:机器学习从入门到精通—— Logistic回归与最大熵模型_机器学习_16

相对应模型代码实现

逻辑斯蒂

class LogisticReressionClassifier:
def __init__(self, max_iter=200, learning_rate=0.01):
self.max_iter = max_iter
self.learning_rate = learning_rate

def sigmoid(self, x):
return 1 / (1 + exp(-x))

def data_matrix(self, X):
data_mat = []
for d in X:
data_mat.append([1.0, *d])
return data_mat

def fit(self, X, y):
# label = np.mat(y)
data_mat = self.data_matrix(X) # m*n
self.weights = np.zeros((len(data_mat[0]), 1), dtype=np.float32)

for iter_ in range(self.max_iter):
for i in range(len(X)):
result = self.sigmoid(np.dot(data_mat[i], self.weights))
error = y[i] - result
self.weights += self.learning_rate * error * np.transpose(
[data_mat[i]])
print('LogisticRegression Model(learning_rate={},max_iter={})'.format(
self.learning_rate, self.max_iter))

# def f(self, x):
# return -(self.weights[0] + self.weights[1] * x) / self.weights[2]

def score(self, X_test, y_test):
right = 0
X_test = self.data_matrix(X_test)
for x, y in zip(X_test, y_test):
result = np.dot(x, self.weights)
if (result > 0 and y == 1) or (result < 0 and y == 0):
right += 1
return right / len(X_test)

最大熵模型代码实现

class MaxEntropy:
def __init__(self, EPS=0.005):
self._samples = []
self._Y = set() # 标签集合,相当去去重后的y
self._numXY = {} # key为(x,y),value为出现次数
self._N = 0 # 样本数
self._Ep_ = [] # 样本分布的特征期望值
self._xyID = {} # key记录(x,y),value记录id号
self._n = 0 # 特征键值(x,y)的个数
self._C = 0 # 最大特征数
self._IDxy = {} # key为(x,y),value为对应的id号
self._w = []
self._EPS = EPS # 收敛条件
self._lastw = [] # 上一次w参数值

def loadData(self, dataset):
self._samples = deepcopy(dataset)
for items in self._samples:
y = items[0]
X = items[1:]
self._Y.add(y) # 集合中y若已存在则会自动忽略
for x in X:
if (x, y) in self._numXY:
self._numXY[(x, y)] += 1
else:
self._numXY[(x, y)] = 1

self._N = len(self._samples)
self._n = len(self._numXY)
self._C = max([len(sample) - 1 for sample in self._samples])
self._w = [0] * self._n
self._lastw = self._w[:]

self._Ep_ = [0] * self._n
for i, xy in enumerate(self._numXY): # 计算特征函数fi关于经验分布的期望
self._Ep_[i] = self._numXY[xy] / self._N
self._xyID[xy] = i
self._IDxy[i] = xy

def _Zx(self, X): # 计算每个Z(x)值
zx = 0
for y in self._Y:
ss = 0
for x in X:
if (x, y) in self._numXY:
ss += self._w[self._xyID[(x, y)]]
zx += math.exp(ss)
return zx

def _model_pyx(self, y, X): # 计算每个P(y|x)
zx = self._Zx(X)
ss = 0
for x in X:
if (x, y) in self._numXY:
ss += self._w[self._xyID[(x, y)]]
pyx = math.exp(ss) / zx
return pyx

def _model_ep(self, index): # 计算特征函数fi关于模型的期望
x, y = self._IDxy[index]
ep = 0
for sample in self._samples:
if x not in sample:
continue
pyx = self._model_pyx(y, sample)
ep += pyx / self._N
return ep

def _convergence(self): # 判断是否全部收敛
for last, now in zip(self._lastw, self._w):
if abs(last - now) >= self._EPS:
return False
return True

def predict(self, X): # 计算预测概率
Z = self._Zx(X)
result = {}
for y in self._Y:
ss = 0
for x in X:
if (x, y) in self._numXY:
ss += self._w[self._xyID[(x, y)]]
pyx = math.exp(ss) / Z
result[y] = pyx
return result

def train(self, maxiter=1000): # 训练数据
for loop in range(maxiter): # 最大训练次数
print("iter:%d" % loop)
self._lastw = self._w[:]
for i in range(self._n):
ep = self._model_ep(i) # 计算第i个特征的模型期望
self._w[i] += math.log(self._Ep_[i] / ep) / self._C # 更新参数
print("w:", self._w)
if self._convergence(): # 判断是否收敛
break

参考: ​​DataWhale​​.组队学习


标签:精通,return,入门,模型,斯谛,Logistic,._,self,def
From: https://blog.51cto.com/u_13859040/5814509

相关文章

  • 651 Bootstrap_栅格系统_入门 and 652 Bootstrap栅格系统注意事项
    ##响应式布局同一套页面可以兼容不同分辨率的设备实现:依赖于栅格系统:将一行平均分成十二个格子,可以指定元素占几个格子步骤:1、定义容器,......
  • 阿里开源规则引擎QLExpress-入门实战
    规则引擎常用的规则引擎目前主要有Drools、Aviator、Easyrule、QLExpress,如下表格是对这些规则引擎的分析对比:结合本人实际项目,我们的项目业务属性是电商,对性能要求比......
  • 动态规划学习入门(小白零基础)
    动态规划学习入门(小白零基础)基础概念如果某一问题可拆解成若干重叠子问题,即可用动态规划解决。重叠子问题:比如斐波那契数列F(n)可分解成F(n-1)+F(n-2),而F(n-1)又可......
  • 阿里云配置负载均衡快速入门
    慎选监听配置的高级配置“开启会话保持”功能,单机测试负截均衡,看不到调度IP切换效果负载均衡从诞生到现在也随着网络业务的变化而不断的进化,逐渐发展成为现在云化的负......
  • Logstash 入门实战(3)--input plugin 介绍
    本文主要概述Logstash的一些最受欢迎的输入插件,以大致了解Logstash的用途;相关的环境及软件信息如下:CentOS 7.9、Logstash8.2.2。1、什么是Logstashinput插件Logsta......
  • AJAX基础+Axios快速入门+JSON使用+综合案例
    目录1、AJAX1.1概述1.1.1作用1.1.2同步和异步1.2快速入门1.2.1服务端实现1.2.2客户端实现1.3案例1.3.1需求1.3.2分析1.3.2后端实现1.3.3前端实现2、Axios异步......
  • PhantomJS入门使用
    概述​​官网​​​,​​GitHub​​​,​​下载地址​​​简介:一个基于webkit的JSAPI。它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JS代码。任何你可以......
  • git和github新手安装使用教程(三步入门)
    git和github新手安装使用教程(三步入门)对于新手来说,每次更换设备时,github的安装和配置都会耗费大量时间。主要原因是每次安装时都只关心了【怎么做】,而忘记了记住【为什么......
  • Python 基础:入门必备知识
    Python基础:入门必备知识1标识符标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。以下......
  • 小白入门kafka-附源码
    现在消息队列的主流kafaka面试过程中经常被提到,所以进行了学习和总结现在分享给大家,如有疑问可以评论沟通。 基础API使用源码和spirngboot+kafka集成源码:https://files.......