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
Indoor Rainy Happy Humid
Indoor Rainy Happy Dry
Indoor Rainy Sad Dry
Indoor Rainy Sad Humid
Indoor Cloudy Sad Humid
Indoor Cloudy Sad Humid
public class Maxent {

	List<Instance> instanceList = new ArrayList<Instance>();
	List<Feature> featureList = new ArrayList<Feature>();
	List<Integer> featureCountList = new ArrayList<Integer>();
	List<String> labels = new ArrayList<String>();
	float[] weight = null;
	float[] lastweight = null;
	float[] empiricalE = null;
	float[] modelE = null;
	int M = 0;

	public static void main(String[] args) throws IOException {

		String path = System.getProperty("user.dir") + "/config/maxent";
		Maxent maxent = new Maxent();
		maxent.loadData(path);
		maxent.train(200);
		List<String> fieldList = new ArrayList<String>();
		fieldList.add("Sunny");
		float[] prob = maxent.predict(fieldList);
		System.out.println(Arrays.toString(prob));
	}

	/**
	 * 加载数据,并且将几个变量赋值
	 * featureList:特征函数的list
	 * featureCountList:与特征函数一一对应的,特征函数出现的次数
	 * instanceList:样本数据list
	 * labels:类别list
	 * @param path
	 * @throws IOException
	 */
	public void loadData(String path) throws IOException {

		BufferedReader br = new BufferedReader(new FileReader(new File(path)));
		String line = br.readLine();
		while(line != null) {
			String[] segs = line.split("\\s");
			String label = segs[0];
			List<String> fieldList = new ArrayList<String>();
			for(int i = 1; i < segs.length; i++) {
				fieldList.add(segs[i]);
				Feature feature = new Feature(label, segs[i]);
				int index = featureList.indexOf(feature);
				if(index == -1){
					featureList.add(feature);
					featureCountList.add(1);
				} else {
					featureCountList.set(index, featureCountList.get(index) + 1);
				}
			}
			if(fieldList.size() > M) M = fieldList.size();
			Instance instance = new Instance(label,fieldList);
			instanceList.add(instance);
			if(labels.indexOf(label) == -1) labels.add(label);
			line = br.readLine();
		}
	}

	public void train(int maxIt) {

		initParams();
		for(int i = 0; i < maxIt; i++) {
			System.out.println(i);
			modeE();
			for(int w = 0; w < weight.length; w++) {
				lastweight[w] = weight[w];
				weight[w] += 1.0 / M * Math.log(empiricalE[w] / modelE[w]);
			}
			System.out.println(Arrays.toString(weight));
			if(checkExist(lastweight, weight)) break;
		}
	}

	public float[] predict(List<String> fieldList) {

		float[] prob = calProb(fieldList);
		return prob;
	}

	public boolean checkExist(float[] w1, float[] w2) {

		for(int i = 0; i < w1.length; i++) {
			if(Math.abs(w1[i] - w2[i]) >= 0.01)
				return false;
		}
		return true;
	}

	/**
	 * 初始化一些变量
	 * 计算特征函数的经验期望,就是特征函数出现的次数/样本数
	 */
	public void initParams() {

		int size = featureList.size();
		weight = new float[size];
		lastweight = new float[size];
		empiricalE = new float[size];
		modelE = new float[size];

		for(int i = 0; i < size; i++) {
			empiricalE[i] = (float)featureCountList.get(i) / instanceList.size();
		}
	}

	/**
	 * 计算模型期望,即在当前的特征函数的权重下,计算特征函数的模型期望值。
	 */
	public void modeE() {

		modelE = new float[modelE.length];
		for(int i = 0; i < instanceList.size(); i++) {
			List<String> fieldList = instanceList.get(i).fieldList;
			//计算当前样本X对应所有类别的概率
			float[] pro = calProb(fieldList);
			for(int j = 0; j < fieldList.size(); j++) {
				for(int k = 0; k < labels.size(); k++) {
					Feature feature = new Feature(labels.get(k), fieldList.get(j));
					int index = featureList.indexOf(feature);
					if(index != -1)
						modelE[index] += pro[k] * (1.0 / instanceList.size());
				}
			}
		}
	}

	//计算p(y|x),此时的x指的是instance里的field
	public float[] calProb(List<String> fieldList) {

		float[] p = new float[labels.size()];
		float sum = 0;
		for(int i = 0; i < labels.size(); i++) {
			float weightSum = 0;
			for(String field : fieldList) {
				Feature feature = new Feature(labels.get(i), field);
				int index = featureList.indexOf(feature);
				if(index != -1)
					weightSum += weight[index];
			}
			p[i] = (float) Math.exp(weightSum);
			sum += p[i];
		}

		for(int i = 0; i < p.length; i++) {
			p[i] /= sum;
		}
		return p;
	}

	class Instance {

		String label;
		List<String> fieldList = new ArrayList<String>();
		public Instance(String label, List<String> fieldList) {
			this.label = label;
			this.fieldList = fieldList;
		}
	}

	class Feature{

		String label;
		String value;
		public Feature(String label, String value) {
			this.label = label;
			this.value = value;
		}
		@Override
		public boolean equals(Object obj) {
			Feature feature = (Feature) obj;
			if(this.label.equals(feature.label) && this.value.equals(feature.value))
				return true;
			return false;
		}
		@Override
		public String toString() {
			return "[" + label + ", " + value + "]";
		}

	}
}

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

时间: 2024-08-29 19:48:45

maxent:最大熵模型的java实现,GIS训练的相关文章

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() d

最大熵模型 Maximum Entropy Model

熵的概念在统计学习与机器学习中真是很重要,熵的介绍在这里:信息熵 Information Theory .今天的主题是最大熵模型(Maximum Entropy Model,以下简称MaxEnt),MaxEnt 是概率模型学习中一个准则,其思想为:在学习概率模型时,所有可能的模型中熵最大的模型是最好的模型:若概率模型需要满足一些约束,则最大熵原理就是在满足已知约束的条件集合中选择熵最大模型.最大熵原理指出,对一个随机事件的概率分布进行预测时,预测应当满足全部已知的约束,而对未知的情况不要做任何主

最大熵模型

我的理解:在限制的条件下,根据已知情况求解未知情况,最优解的选择就是使得未知的熵最大的那个概率 我们在投资时常常讲不要把所有的鸡蛋放在一个篮子里,这样可以降低风险.在信息处理中,这个原理同样适用.在数学上,这个原理称为最大熵原理(the maximum entropy principle). 让我们看一个拼音转汉字的简单的例子.假如输入的拼音是"wang-xiao-bo",利用语言模型,根据有限的上下文(比如前两个词),我们能给出两个最常见的名字"王小波"和&quo

最大熵模型简记

最近两天简单看了下最大熵模型,特此做简单笔记,后续继续补充.最大熵模型是自然语言处理(NLP, nature language processing)被广泛运用,比如文本分类等.主要从分为三个方面,一:熵的数学定义:二:熵数学形式化定义的来源:三:最大熵模型. 注意:这里的熵都是指信息熵. 一:熵的数学定义: 下面分别给出熵.联合熵.条件熵.相对熵.互信息的定义. 熵:如果一个随机变量X的可能取值为X = {x1, x2,-, xk},其概率分布为P(X = xi) = pi(i= 1,2, .

最大熵模型原理小结

最大熵模型(maximum entropy model, MaxEnt)也是很典型的分类算法了,它和逻辑回归类似,都是属于对数线性分类模型.在损失函数优化的过程中,使用了和支持向量机类似的凸优化技术.而对熵的使用,让我们想起了决策树算法中的ID3和C4.5算法.理解了最大熵模型,对逻辑回归,支持向量机以及决策树算法都会加深理解.本文就对最大熵模型的原理做一个小结. 1. 熵和条件熵的回顾 在决策树算法原理(上)一文中,我们已经讲到了熵和条件熵的概念,这里我们对它们做一个简单的回顾. 熵度量了事物

张乐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的储存格式不是最大熵模型

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)

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

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

最大熵模型 推导

1.似然函数 概率和似然的区别:概率是已知参数的条件下预测未知事情发生的概率,而似然性是已知事情发生的前提下估计模型的参数.我们通常都是将似然函数取最大值时的参数作为模型的参数. 那么为何要取似然函数取最大值的参数作为模型的参数?我们基于这样的假设:对于已经发生的事情,在同样条件下再次发生的概率就会很大.假如模型的参数固定,然后用这个参数固定的模型来预测已经发生的事情,这时我们得到的概率不一定很大,并且不同的参数得到概率是不一样的,但是事实上这个事情已经发生了,也就是说发生这个事情的概率为1,此