最大熵模型
来源:互联网 发布:微积分中d含义,知乎 编辑:程序博客网 时间:2024/06/05 16:05
- 熵\
假设离散变量X的概率分布是P(X)
- 最大熵模型定义\
假设分类模型是条件概率P(Y|X),给定训练数据集T={(x1,y1),(x2,y2),…,(xn,yn)}学习目标就是用最大熵原理选择最好的模型\
特征函数f(x,y)关于经验分布P*(X,Y)的期望值为:
# 特征函数f(x,y)关于模型P(Y|X)与经验分布P*(X)的期望值为:
我们假设两个期望值相等。
假如有n个特征函数,那么就有n个约束。\
定义:最大熵模型
条件概率分布P(Y|X)的条件熵最大,且满足上述期望值相等的约束:
- 最大熵模型学习
引入拉格朗日因子w0,w1,…,wn
对偶问题:
对L(P,w)中P(y|x)的偏导数且为0得到:
P_w就是最大熵模型。\
之后求解对偶问题外部极大化问题:
- 对最大熵模型极大似然估计 == 对偶函数极大化\
极大似然估计:
from _collections import defaultdictimport mathfrom ensurepip import __main__import codecsclass MaxEnt(object): ''' classdocs ''' def __init__(self): ''' Constructor ''' self.samples = [] self.labels = [] self.N = 0 self.M = 0 #特征数量 self.lambdas = [] self.last_lambdas = [] self.current_lambdas = [] self.C = 0 self.stepValues = []; self._ep_ = [] # self._ep = [] self.numXY = defaultdict(int) self.featureId_map = {} self.Y = [] def fit(self,trainX,trainY,iterNum=100): self.samples = trainX self.labels = trainY self.Y = set(trainY) self.N = len(trainY)# self.M = len(trainX[0])# self.getC() self.C = max([len(sample) for sample in trainX]) for id,sample in enumerate(self.samples): y = self.labels[id] for x in set(sample): self.numXY[(x,y)] += 1.0 self.M = len(self.numXY.keys()) self.train(iterNum) def _EP_(self): #self._ep_ = [xyCount/self.N for xyCount in self.numXY] for id,xy in enumerate(self.numXY.keys()): self._ep_.append(self.numXY[xy]/self.N) self.featureId_map[xy] = id print len(self._ep_) def ZX(self,sample): sumY = 0.0 for y in self.Y: sum = 0.0 for x in sample: if self.numXY.has_key((x,y)): sum += self.current_lambdas[self.featureId_map[(x,y)]] sumY += math.exp(sum) return sumY def pXY(self,sample): pxy = 0.0 ZX_sum = self.ZX(sample) result = [] for y in self.Y: pxy_sum = 0.0 for x in sample: if self.numXY.has_key((x,y)): pxy_sum += self.current_lambdas[self.featureId_map[(x,y)]] result.append((math.exp(pxy_sum)/ZX_sum,y)) return result def _Ep(self): self._ep = [0.0]*self.M for sample in self.samples: pxy = self.pXY(sample) for p,y in pxy: for x in sample: if self.numXY.has_key((x,y)): self._ep[self.featureId_map[(x,y)]] += p*1.0/self.N def train(self,iterNum): self.current_lambdas = [0.0]*self.M print len(self.current_lambdas) self._EP_() for iter in range(iterNum): #self.last_lambdas = self.current_lambdas self._Ep() for id,w in enumerate(self.current_lambdas):# print id self.current_lambdas[id] = w + 1.0/self.C*math.log(self._ep_[id]/self._ep[id]) print self.current_lambdas def predict(self,testX): X = testX p = self.pXY(X) print p #def predict(self,testX):def loadfile(): trainX = [] trainY = [] for line in codecs.open("./train",'r','utf-8').readlines(): trainY.append(line.strip().split("\t")[0]) trainX.append(line.strip().split("\t")[1:]) return trainX,trainYif __name__ == "__main__": maxEnt = MaxEnt() trainX,trainY = loadfile() maxEnt.fit(trainX,trainY,1000) maxEnt.predict(["sunny", "hot", "high", "FALSE"]) maxEnt.predict(["sunny", "hot", "high", "True"]) maxEnt.predict(["overcast", "hot", "high", "FALSE"])###yes maxEnt.predict(["sunny", "hot", "high", "FALSE"]) maxEnt.predict(["sunny", "hot", "high", "FALSE"])
- 最大熵模型:读书笔记
- 最大熵模型
- 最大熵模型:读书笔记
- 最大熵模型
- 最大熵模型
- 最大熵模型
- 最大熵模型:读书笔记
- 最大熵模型
- 最大熵模型
- 最大熵模型
- 最大熵模型
- 最大熵模型介绍
- 最大熵模型
- 最大熵模型
- 最大熵模型
- 最大熵模型
- 最大熵模型
- 6.2 最大熵模型
- Android顶部状态栏和底部导航栏高度计算
- Spring boot整合activiti modeler 5.22
- MySQL
- Java设计模式——工厂方法(Factory Method)
- 为什么使用memcached
- 最大熵模型
- BIEE 12c 使用wlst脚本修改角色名
- 开发人员学Linux(2):VirtualBox中安装CentOS7系统设置
- SDUT-M--二分查找
- 113. Path Sum II
- 工厂生产各阶段名词
- nodejs支持ES6语法(BABEL)
- Spring中@Controller和@RestController之间的区别
- VR 一些识别概念