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

关于最大熵模型的介绍请看:http://www.cnblogs.com/hexinuaa/p/3353479.html

下面是GIS训练算法的python实现,代码不到100行。

from collections import defaultdict

import math

class MaxEnt(object):

def __init__(self):

self.feats = defaultdict(int)

self.trainset = []

self.labels = set()

def load_data(self,file):

for line in open(file):

fields = line.strip().split()

# at least two columns

if len(fields) <
2: continue

# the first column is label

label = fields[0]

self.labels.add(label)

for f
in set(fields[1:]):

# (label,f) tuple is feature

self.feats[(label,f)] += 1

self.trainset.append(fields)

def _initparams(self):

self.size = len(self.trainset)

# M
param for GIS training algorithm

self.M = max([len(record)-1
for record in self.trainset])

self.ep_ = [0.0]*len(self.feats)

for i,f in enumerate(self.feats):

# calculate feature expectation on empirical distribution

self.ep_[i] = float(self.feats[f])/float(self.size)

# each feature function correspond to id

self.feats[f] = i

#
init weight for each feature

self.w = [0.0]*len(self.feats)

self.lastw = self.w

def probwgt(self,features,label):

wgt = 0.0

for f in features:

if (label,f)
in self.feats:

wgt += self.w[self.feats[(label,f)]]

return math.exp(wgt)

"""

    calculate feature expectation on model distribution

    """

def Ep(self):

ep = [0.0]*len(self.feats)

for record
in self.trainset:

features = record[1:]

# calculate p(y|x)

prob = self.calprob(features)

for f
in features:

for w,l
in prob:

# only focus on features from training data.

if (l,f)
in self.feats:

# get feature id

idx = self.feats[(l,f)]

# sum(1/N * f(y,x)*p(y|x)), p(x) = 1/N

ep[idx] += w * (1.0/self.size)

return ep

def _convergence(self,lastw,w):

for w1,w2
in zip(lastw,w):

if abs(w1-w2) >=
0.01:

return
False

return
True

def train(self, max_iter =1000):

self._initparams()

for i in range(max_iter):

print
iter %d ...‘%(i+1)

# calculate feature expectation on model distribution

self.ep = self.Ep()

self.lastw = self.w[:]

for i,win enumerate(self.w):

delta = 1.0/self.M * math.log(self.ep_[i]/self.ep[i])

# update w

self.w[i] += delta

print self.w

# test if the algorithm is convergence

if self._convergence(self.lastw,self.w):

break

def calprob(self,features):

wgts = [(self.probwgt(features, l),l)
for l in self.labels]

Z = sum([ w for w,l
in wgts])

prob = [ (w/Z,l) for w,l
in wgts]

return prob

def predict(self,input):

features = input.strip().split()

prob = self.calprob(features)

prob.sort(reverse=True)

return prob

运行:

prepare training data:

Outdoor Sunny Happy

Outdoor Sunny Happy Dry

Outdoor Sunny Happy Humid

Outdoor Sunny Sad Dry

Outdoor Sunny Sad Humid

Outdoor Cloudy Happy Humid

Outdoor Cloudy Happy Humid

Outdoor Cloudy Sad Humid

Outdoor Cloudy Sad Humid

Indoor Rainy Happy Humid

Indoor Rainy Happy Dry

Indoor Rainy Sad Dry

Indoor Rainy Sad Humid

Indoor Cloudy Sad Humid

Indoor Cloudy Sad Humid

open ipython to run the following commands:

In [11]: import maxent

In [12]: model = maxent.MaxEnt()

In [13]: model.load_data(‘data/gameLocation.dat‘)

In [14]: model.train()

In [11]: import maxent

In [12]: model = maxent.MaxEnt()

In [13]: model.load_data(‘data/gameLocation.dat‘)

In [14]: model.train()

iter 1 ...

iter 2 ...

iter 3 ...

iter 4 ...

iter 5 ...

iter 6 ...

iter 7 ...

iter 8 ...

iter 9 ...

iter 10 ...

iter 11 ...

iter 12 ...

iter 13 ...

iter 14 ...

iter 15 ...

iter 16 ...

iter 17 ...

iter 18 ...

iter 19 ...

iter 20 ...

iter 21 ...

iter 22 ...

iter 23 ...

iter 24 ...

iter 25 ...

iter 26 ...

iter 27 ...

iter 28 ...

iter 29 ...

iter 30 ...

iter 31 ...

iter 32 ...

iter 33 ...

iter 34 ...

iter 35 ...

iter 36 ...

iter 37 ...

iter 38 ...

iter 39 ...

iter 40 ...

iter 41 ...

iter 42 ...

iter 43 ...

iter 44 ...

iter 45 ...

iter 46 ...

iter 47 ...

iter 48 ...

iter 49 ...

iter 50 ...

iter 51 ...

iter 52 ...

iter 53 ...

iter 54 ...

iter 55 ...

iter 56 ...

iter 57 ...

iter 58 ...

iter 59 ...

iter 60 ...

iter 61 ...

iter 62 ...

iter 63 ...

iter 64 ...

iter 65 ...

iter 66 ...

iter 67 ...

iter 68 ...

iter 69 ...

iter 70 ...

iter 71 ...

iter 72 ...

iter 73 ...

iter 74 ...

iter 75 ...

iter 76 ...

iter 77 ...

iter 78 ...

iter 79 ...

iter 80 ...

iter 81 ...

iter 82 ...

iter 83 ...

iter 84 ...

iter 85 ...

iter 86 ...

iter 87 ...

iter 88 ...

iter 89 ...

iter 90 ...

iter 91 ...

iter 92 ...

iter 93 ...

iter 94 ...

iter 95 ...

iter 96 ...

iter 97 ...

iter 98 ...

iter 99 ...

iter 100 ...

iter 101 ...

iter 102 ...

iter 103 ...

iter 104 ...

iter 105 ...

iter 106 ...

iter 107 ...

iter 108 ...

iter 109 ...

iter 110 ...

iter 111 ...

iter 112 ...

iter 113 ...

iter 114 ...

iter 115 ...

iter 116 ...

iter 117 ...

iter 118 ...

iter 119 ...

iter 120 ...

iter 121 ...

iter 122 ...

iter 123 ...

iter 124 ...

iter 125 ...

iter 126 ...

iter 127 ...

iter 128 ...

iter 129 ...

iter 130 ...

iter 131 ...

iter 132 ...

iter 133 ...

iter 134 ...

iter 135 ...

iter 136 ...

iter 137 ...

iter 138 ...

iter 139 ...

iter 140 ...

iter 141 ...

iter 142 ...

iter 143 ...

iter 144 ...

In [16]: model.predict(‘Sunny‘)

Out[16]: [(0.9763203118841158, ‘Outdoor‘), (0.02367968811588421, ‘Indoor‘)]

In [18]: model.predict(‘Cloudy‘)

Out[18]: [(0.7136730549489295, ‘Outdoor‘), (0.28632694505107054, ‘Indoor‘)]

时间: 2024-11-07 16:33:33

95行代码实现最大熵模型训练的相关文章

95行代码极验滑动验证码?是远远不够的!大牛石锤!

一直以来,极验坚持的理念是:醉心技术,以不变之变以应万变.通过不断地钻研技术,升级产品,每日迭代更新,全网联动联防.在攻防过程中,始终将对手甩在身后,我们团队始终坚守着,因为我们相信行动才是最好的回应. 所以,在我们看来,大家围绕着"行为验证"安全产品而展开的相关技术细节讨论,是对我们最大的推动,极验"行为验证"的成功离不开大家的建言献策. "行为验证"本质上是一个人工智能产品 人工智能决策演示效果 我们还会从多个维度对用户的交互行为进行采集,一

张乐C++最大熵模型的命令行实现方法

最近做了一个应用最大熵模型对movie-review做二元情感分类的项目. 其中最大熵模型应用的是张乐教授的最大熵工具http://homepages.inf.ed.ac.uk/lzhang10/maxent_toolkit.html. 分析数据movie-review应用的是Bo-Pang http://www.cs.cornell.edu/people/pabo/movie-review-data/ 其中movie-review如下图所示,由于movie-review的储存格式不是最大熵模型

maxent:最大熵模型的java实现,GIS训练

先给出实现的代码,以后再进行一些理论的概述 训练样本 Outdoor Sunny Happy Outdoor Sunny Happy Dry Outdoor Sunny Happy Humid Outdoor Sunny Sad Dry Outdoor Sunny Sad Humid Outdoor Cloudy Happy Humid Outdoor Cloudy Happy Humid Outdoor Cloudy Sad Humid Outdoor Cloudy Sad Humid Ind

50行代码实现缓存,JAVA内存模型原理

遇见这样的高人怎么办??下面是一个简单缓存的实现,相当牛叉!自己看吧,只有50行代码. 摘自:http://www.oschina.net/code/snippet_55577_3887 import java.util.Map; import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.Lock; import java.util.

最大熵模型中的数学推导

最大熵模型中的数学推导 查看原文,点击这里 0 引言 写完SVM之后,一直想继续写机器学习的系列,无奈一直时间不稳定且对各个模型算法的理解尚不够,所以导致迟迟未动笔.无独有偶,重写KMP得益于今年4月个人组织的算法班,而动笔继续写这个机器学习系列,正得益于今年10月组织的机器学习班. 10月26日机器学习班第6次课,身为讲师之一的邹博讲最大熵模型,他从熵的概念,讲到为何要最大熵.最大熵的推导,以及求解参数的IIS方法,整个过程讲得非常流畅,特别是其中的数学推导.晚上我把他的PPT 在微博上公开分

3月机器学习在线班第六课笔记--信息熵与最大熵模型

原文:https://www.zybuluo.com/frank-shaw/note/108124 信息熵 信息是个很抽象的概念.人们常常说信息很多,或者信息较少,但却很难说清楚信息到底有多少.比如一本五十万字的中文书到底有多少信息量.直到1948年,香农提出了“信息熵”的概念,才解决了对信息的量化度量问题.(百度百科) 香农定义的信息熵的计算公式如下: H(X)=−∑p(xi)log(p(xi))    (i=1,2,…,n) 其中X 表示的是随机变量,随机变量的取值为(x1,x2,…,xn)

40行代码的人脸识别实践【转】

转自:http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend 版权声明:本文为博主原创文章,转载请联系作者取得授权. 目录(?)[+] 40行代码的人脸识别实践 40行代码的人脸识别实践 前言 一点区分 所用工具 Dlib 人脸识别 前期准备 识别流程 代码 运行结果 前言 很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了.这些

机器学习实战——最大熵模型

信息熵 香农与1948年提出的信息论以其中的信息熵这一基本概念为基础,用来表征人们对客观事件的不确定性的度量,与物理学中的熵表征物质的混乱程度有相似之处. 当处理不确定事件时,最常用的方式就是用概率方式描述,一般假定不确定的事件A每种可能的状态都有一个概率与之对应: P(Ai)s.t.∑i=1nP(Ai)=1P(Ai)≥0 而总共可能的状态如果是有限个(n个),那么就是离散的事件,用离散的随机变量表示:如果可能的状态是无穷多个,那么就是连续的事件,用连续的随机变量表示.本文所有说明仅以离散事件说

40行代码的人脸识别实践

很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了.这些人里包括曾经的我自己.其实如果如果你不是非要深究其中的原理,只是要实现这一工作的话,人脸识别也没那么难.今天我们就来看看如何在40行代码以内简单地实现人脸识别. 一点区分 对于大部分人来说,区分人脸检测和人脸识别完全不是问题.但是网上有很多教程有无无意地把人脸检测说成是人脸识别,误导群众,造成一些人认为二者是相同的.其实,人脸检测解决的问题是确定一张图上有木有人脸,而人脸识别