使用python实现最大熵模型,在原来作者的基础上重写了predict, 增加了predict_proba()方法

原作者:blog.csdn.net/slx_share/article/details/80097020
另外,更正了原本代码种存在的一些bug

最大熵原理: 在学习概率模型时,在所有可能的概率模型分布中,熵最大的模型就是最好的模型。所以用最大熵原理作为约束条件选取的模型就是最大熵模型。最大熵原理通过熵的最大化来表示等可能性。

整体代码如下:

本代码的github地址:https://github.com/yinboliu-git/model/blob/main/ML/maxnet.py

import math
import numpy as np
from collections import defaultdictclass MaxEnt:def __init__(self, epsilon=1e-3, maxstep=100):self.epsilon = epsilonself.maxstep = maxstepself.w = None  # 特征函数的权重self.labels = None  # 标签self.fea_list = []  # 特征函数self.px = defaultdict(lambda: 0)  # 经验边缘分布概率self.pxy = defaultdict(lambda: 0)  # 经验联合分布概率,由于特征函数为取值为0,1的二值函数,所以等同于特征的经验期望值self.exp_fea = defaultdict(lambda: 0)  # 每个特征在数据集上的期望self.data_list = []  # 样本集,元素为tuple((X),y)self.N = None  # 样本总量self.M = None  # 某个训练样本包含特征的总数,这里假设每个样本的M值相同,即M为常数。其倒数类似于学习率self.n_fea = None  # 特征函数的总数def init_param(self, X_data, y_data):# 根据传入的数据集(数组)初始化模型参数self.N = X_data.shape[0]self.labels = np.unique(y_data)self.fea_func(X_data, y_data)self.n_fea = len(self.fea_list)self.w = np.zeros(self.n_fea)self._exp_fea(X_data, y_data)returndef fea_func(self, X_data, y_data, rules=None):# 特征函数if rules is None:  # 若没有特征提取规则,则直接构造特征,此时每个样本没有缺失值的情况下的特征个数相同,等于维度for X, y in zip(X_data, y_data):X = tuple(X)self.px[X] += 1.0 / self.N  # X的经验边缘分布self.pxy[(X, y)] += 1.0 / self.N  # X,y的经验联合分布for dimension, val in enumerate(X):key = (dimension, val, y)if not key in self.fea_list:self.fea_list.append(key)  # 特征函数,由 维度+维度下的值+标签 构成的元组self.M = X_data.shape[1]else:self.M = defaultdict(int)  # 字典存储每个样本的特征总数for i in range(self.N):self.M[i] = X_data.shape[1]pass  # 根据具体规则构建def _exp_fea(self, X_data, y_data):# 计算特征的经验期望值for X, y in zip(X_data, y_data):for dimension, val in enumerate(X):fea = (dimension, val, y)self.exp_fea[fea] += self.pxy[(tuple(X), y)]  # 特征存在取值为1,否则为0returndef _py_X(self, X):# 当前w下的条件分布概率,输入向量X和y的条件概率py_X = defaultdict(float)for y in self.labels:s = 0for dimension, val in enumerate(X):tmp_fea = (dimension, val, y)if tmp_fea in self.fea_list:  # 输入X包含的特征s += self.w[self.fea_list.index(tmp_fea)]py_X[y] = math.exp(s)normalizer = sum(py_X.values())for key, val in py_X.items():py_X[key] = val / normalizerreturn py_Xdef _est_fea(self, X_data, y_data):# 基于当前模型,获取每个特征估计期望est_fea = defaultdict(float)for X, y in zip(X_data, y_data):py_x = self._py_X(X)[y]for dimension, val in enumerate(X):est_fea[(dimension, val, y)] += self.px[tuple(X)] * py_xreturn est_feadef GIS(self,X_data,y_data):# GIS算法更新deltaest_fea = self._est_fea(X_data, y_data)delta = np.zeros(self.n_fea)for j in range(self.n_fea):try:delta[j] = 1 / self.M * math.log(self.exp_fea[self.fea_list[j]] / est_fea[self.fea_list[j]])except:continuedelta = delta / delta.sum()  # 归一化,防止某一个特征权重过大导致,后续计算超过范围return deltadef IIS(self, delta, X_data, y_data):# IIS算法更新deltag = np.zeros(self.n_fea)g_diff = np.zeros(self.n_fea)for j in range(self.n_fea):for k in range(self.N):g[j] += self.px[tuple(X_data[k])] * self._py_X(X_data[k])[y_data[k]] * math.exp(delta[j] * self.M[k])g_diff[j] += g[j] * self.M[k]g[j] -= self.exp_fea[j]delta[j] -= g[j] / g_diff[j]return deltadef fit(self, X_data, y_data):# 训练,迭代更新wiself.init_param(X_data, y_data)if isinstance(self.M, int):i = 0while i < self.maxstep:i += 1delta = self.GIS(X_data,y_data)# if max(abs(delta)) < self.epsilon:  # 所有的delta都小于阈值时,停止迭代#     breakself.w += deltaelse:i = 0delta = np.random.rand(self.n_fea)while i < self.maxstep:i += 1delta = self.IIS(delta, X_data, y_data)# if max(abs(delta)) < self.epsilon:#     breakself.w += deltareturndef predict(self, X):# 输入x(数组),返回条件概率最大的标签y_p = self.predict_proba(X)y_p = np.argmax(y_p,axis=1).reshape(-1,1)return y_pdef predict_proba(self,X):y_proba = []for x in X:py_x = self._py_X(x)y_proba.append(list(py_x.values()))return np.array(y_proba)if __name__ == '__main__':from sklearn.datasets import load_iris, load_digitsdata = load_iris()X_data = data['data']y_data = data['target']ME = MaxEnt(maxstep=2)ME.fit(X_data,y_data)y_p = ME.predict(X_data[-10:,:]) # 测试代码y_proba = ME.predict_proba(X_data[-10:, :])print(y_p)print(y_proba)

环境:python3.7

python3实现maxent 最大熵模型相关推荐

  1. MaxEnt: 最大熵模型(Maximum Entropy Models)

    转自:http://www.zhizhihu.com/html/y2011/3489.html 刚看完HMM,因为有个ME-HMM方法,所以再看看最大熵模型,最后再把CRF模型看看,这一系列理论大体消 ...

  2. 最大熵模型(MaxEnt)解析

    给出了最大熵模型的一般形式(其中的f为特征函数,后面我们还会讲到): 而文献[5]中我们从另外一种不同的角度也得出了多元逻辑回归的一般形式: 可见,尽管采用的方法不同,二者最终是殊途同归.万法归宗了. ...

  3. 050B 基于最大熵模型软件(MaxEnt)和ArcGis地理系统的分布区(适生区)预测教程

    课程内容目录(课程标题即课程内容): 050B-1 视频附带资料下载和密码:软件-数据-地图-文献下载-持续更新 050B-2 MaxEnt最大熵分布预测软件的下载安装 050B-3 ArcGis10 ...

  4. 最大熵模型(MaxEnt):万法归宗(下)

    在上一篇文章[1]中,我们已经得到了与最大熵模型之学习等价的带约束的最优化问题: 注意上述公式中还隐含一个不等式约束即 P(y|x)≥0.求解这个带约束的最优化问题,所得之解即为最大熵模型学习的解.本 ...

  5. 最大熵模型(MaxEnt):万法归宗(上)

    引言:文献[1]中第88页,给出了最大熵模型的一般形式(其中的f为特征函数,后面我们还会讲到): 而文献[5]中我们从另外一种不同的角度也得出了多元逻辑回归的一般形式: 可见,尽管采用的方法不同,二者 ...

  6. 95行代码实现最大熵模型训练

    关于最大熵模型的介绍请看:http://www.cnblogs.com/hexinuaa/p/3353479.html 以下是GIS训练算法的python实现,代码不到100行. from colle ...

  7. 统计学习方法笔记(四)-最大熵模型原理及python实现

    最大熵模型 最大熵模型 最大熵原理 最大熵模型 代码实现 案例地址 最大熵模型 最大熵模型(maximum entropy model)可以用于二分类,也可以用于多分类.其是由最大熵原理推导实现的,所 ...

  8. 最大熵模型(Maximum Entropy Model)文献阅读指南

    最大熵模型(Maximum Entropy Model)是一种机器学习方法,在自然语言处理的许多领域(如词性标注.中文分词.句子边界识别.浅层句法分析及文本分类等)都有比较好的应用效果.张乐博士的最大 ...

  9. 统计学习方法第六章作业:逻辑斯谛梯度下降法、最大熵模型 IIS / DFP 算法代码实现

    逻辑斯谛梯度下降法 import numpy as np import matplotlib.pyplot as pltclass logist:def __init__(self,a=1,c=Non ...

最新文章

  1. 我的数字万用表怎么了?
  2. 如何实现 集群化/Session 复制-doc(cluster-howto.html)
  3. 微软日本每周只上四天班,销售额提升39.9%!网友:老板快来看啊
  4. 算法笔记--字符串hash
  5. 深度学习(一)——MP神经元模型, BP算法, 神经元激活函数, Dropout
  6. Framework打包
  7. 好想写点儿什么,但是不知道怎么写
  8. 数组对象的reduce方法
  9. KuaiRec | 快手发布首个稠密度高达99%的推荐数据集, 可用于多种推荐系统方向研究...
  10. React Native中的视频编码
  11. 作为老师的一些思考(二)
  12. 2019届互联网校招薪资盘点!
  13. 数据挖掘(六)——模型优化与评估方法
  14. 使用蓝桥杯单片机做一个智能密码锁可以修改密码
  15. MATLAB中快捷注释方法和使用“%%”将代码分块运行方法
  16. python爬取12306列车信息自动抢票并自动识别验证码(二)selenium登录验证篇
  17. python高级进阶_7_Python动态语言之紧箍咒(slots)03
  18. 循环结构的数据流分析方法
  19. 利用Wireless Repeater(无线中继模式)扩大你的无线网络
  20. toad可以连接mysql吗_toad的连接数据库

热门文章

  1. 计算机编程辅导班,昆明少儿计算机编程辅导班
  2. 记录一下python爬虫手机app遇到的加密
  3. 什么是网络环路问题?
  4. 网易云音乐实时计算平台设计及实践
  5. Blackhat 2017Defcon 25学习笔记
  6. Linux桌面基础:X Window System——Xorg
  7. breezy,dapper,edgy,feisty的含义
  8. 【翻译】DataDog Kafka运维经验谈
  9. Android App性能优化总结
  10. java 混淆_Java 混淆那些事(一):重新认识 ProGuard