最大熵简介
来源:互联网 发布:淘宝女包 编辑:程序博客网 时间:2024/06/07 06:39
一、最大熵模型
1、模型
根据最大熵定义,我们可以将最大熵模型的学习看成约束最优化问题
给定训练数据T = {(x1,y1),.....,(xn,yn)},以及特征函数(就是一个个特征,不要想得太复杂)fi(x,y)。
特征函数定义f(x,y)
特征函数f(x,y)关于经验分布P(x,y)的期望值
模型:
策略:
求得:
对偶形式和最大似然的出的目标函数一样。
对目标函数优化,常用方法:IIS,中间数学推导很多
代码:
#coding=utf-8
'''
Created on 2016��1��12��
@author: qf
'''
from _collections import defaultdict
import math
from ensurepip import __main__
import codecs
class 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,trainY
if __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"])
- 最大熵简介
- 最大熵模型简介------写得很好,
- 最大熵模型简介[例子+推导+GIS求解…
- 最大流-最小割简介
- 最大的PHP开源网店系统ECShop简介
- 最大熵
- 最大熵
- 最大熵
- 深度学习中的最大似然估计简介
- 熵简介
- 最大熵模型:读书笔记
- 最大熵推导
- 最大信息熵原理
- 最大熵模型
- 最大熵模型:读书笔记
- 最大熵模型
- 最大熵模型
- 最大熵模型
- ubuntu 14.04 java开发环境搭建 jdk 以及 inteliJ IDEA安装
- 如何使用gson解析泛型形参并返回相对应的类
- ARM汇编 – (2) ARM程序状态寄存器
- 十、森林与并查集---(2)并查集的创建
- 个人总结 Yii 部分关键代码
- 最大熵简介
- ListView 中嵌入GridView去滚动效果
- HttpURLConnection请求
- HTML列表
- 【转】查询表结构
- ComboBox用AddString添加字符显示乱码
- 删除文件夹
- 二维数据的白化处理
- 笔记2:WebRequest 及 WebResponse 类介绍