计算信息增益(Information Gain),考虑交叉feature

原创 2012年03月30日 18:05:21
 

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

 

/**
 * 
 * @author qibaoyuan
 * 
 */
public class InformationGain {

	/**
	 * calculate the info(entrophy from a list of classes)
	 * 
	 * @param classes
	 *            字符类型的分类信息
	 * @return info entropy
	 */
	static Double calculateEntrophy(List<String> classes) {
		Double info = 0.0;
		try {
			// 总的个数
			int size = classes.size();

			// map to store the count of each unique class
			Map<String, Integer> counter = new HashMap<String, Integer>();

			// iter all the class
			for (String key : classes) {
				// already exists,incremental
				if (counter.containsKey(key.trim()))
					counter.put(key.trim(), counter.get(key.trim()) + 1);
				else
					// set 1
					counter.put(key.trim(), 1);
			}

			// iter the map
			for (Entry<String, Integer> entry : counter.entrySet()) {
				Double ratio = Double.parseDouble(Integer.toString((entry
						.getValue()))) / size;
				info -= ratio * (Math.log(ratio) / Math.log(2));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return info;
	}

	/**
	 * 
	 * @param records
	 *            输入记录 example:{[我 n 1 0 0 0 0 0 YES],[是 n 0 0 0 0 0 0 NO]}
	 * @return
	 */
	static Map<Integer, Double> calculateIG(List<String[]> records,
			Boolean isSingleFeature) {
		Map<Integer, Double> index4select = new HashMap<Integer, Double>();
		try {
			// 1.计算总的info
			List<String> labels = new ArrayList<String>();
			int feature_size = 0;
			for (String[] arr : records) {
				String label = arr[arr.length - 1];
				labels.add(label);
				feature_size = arr.length - 1;

			}

			Map<Integer, List<Object>> features = PermutationTest.genPerLess(
					feature_size, 3);

			Double total = calculateEntrophy(labels);
			System.out.print("label的熵信息:");
			System.out.println(total);

			// 2.计算每个feature的entrophy
			// int i=0;
			for (Entry<Integer, List<Object>> entry1 : features.entrySet()) {

				Double info_i = 0.0;

				Map<String, List<String>> featureMap = new HashMap<String, List<String>>();

				// divide the records according to the feature
				for (String[] arr : records) {

					// get the feature
					String feature = "";
					if (entry1.getValue().size() > 1 && isSingleFeature)
						continue;
					for (Object obj : entry1.getValue()) {
						if (obj instanceof Integer)
							feature += arr[(Integer) obj];
					}

					// check whether if it's counted
					if (featureMap.containsKey(feature)) {
						List<String> featureList = featureMap.get(feature);
						featureList.add(arr[arr.length - 1]);
						featureMap.put(feature, featureList);
					} else {
						List<String> featureList = new ArrayList<String>();
						featureList.add(arr[arr.length - 1]);
						featureMap.put(feature, featureList);
					}

				}

				// calculate entrophy of each value of the feature
				for (Entry<String, List<String>> entry : featureMap.entrySet()) {

					Double score = calculateEntrophy(entry.getValue());

					info_i += (Double.parseDouble(Integer.toString(entry
							.getValue().size())) / records.size()) * score;
				}

				System.out.print("feature " + entry1.getKey() + " ig:");
				System.out.println(total - info_i);

				// ig=f-total
				index4select.put(entry1.getKey(), total - info_i);
			}

			// ///sort by the value
			ArrayList<Integer> keys = new ArrayList<Integer>(
					index4select.keySet());// 得到key集合
			final Map<Integer, Double> scoreMap_temp = index4select;
			Collections.sort(keys, new Comparator<Object>() {

				public int compare(Object o1, Object o2) {

					if (Double.parseDouble(scoreMap_temp.get(o1).toString()) < Double
							.parseDouble(scoreMap_temp.get(o2).toString()))
						return 1;

					if (Double.parseDouble(scoreMap_temp.get(o1).toString()) == Double
							.parseDouble(scoreMap_temp.get(o2).toString()))
						return 0;

					else
						return -1;
				}
			});

			int y = 0;

			for (Integer key : keys) {
				System.out.println(key + "" + features.get(key) + "= "
						+ scoreMap_temp.get(key));
			}
			// //////////////////////

		} catch (Exception e) {
			e.printStackTrace();
		}
		return index4select;
	}

	/**
	 * 从文件读入输入,计算每个feature的ig,最後一列是手工標註的label
	 * 
	 * @param file
	 *            存放手工标注语料的路径
	 */
	static void calculateIG(String file) {
		try {
			FileReader reader = new FileReader(file);
			BufferedReader br = new BufferedReader(reader);
			String line = null;
			List<String[]> lists = new ArrayList<String[]>();
			while ((line = br.readLine()) != null) {
				if (line.trim().length() == 0)
					continue;
				lists.add(line.split("\t"));
			}
			System.out.print(calculateIG(lists,false));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		calculateIG("/home/qibaoyuan/qibaoyuan/lexo/cv/all.txt");
	}

}

信息增益(information gain)

当我们需要对一个随机事件的概率分布进行预测时,我们的预测应当满足全部已知的条件,而对未知的情况不要做任何主观假设。在这种情况下,概率分布最均匀,预测的风险最小。因为这时概率分布的信息熵最大,所以称之为...
  • GAMEloft9
  • GAMEloft9
  • 2014年03月10日 20:35
  • 626

什么是信息增益(Information Gain)

当我们需要对一个随机事件的概率分布进行预测时,我们的预测应当满足全部已知的条件,而对未知的情况不要做任何主观假设。在这种情况下,概率分布最均匀,预测的风险最小。因为这时概率分布的信息熵最大,所以称之为...
  • shisibushiba
  • shisibushiba
  • 2016年03月03日 21:03
  • 1197

【机器学习】信息量,信息熵,交叉熵,KL散度和互信息(信息增益)

首先先强烈推荐一篇外文博客Visual Information Theory这个博客的博主colah是个著名的计算机知识科普达人,之前非常著名的那篇LSTM讲解的文章也是他写的。这篇文章详细讲解了信息...
  • haolexiao
  • haolexiao
  • 2017年04月12日 15:20
  • 3100

信息增益以及决策树算法-机器学习实战(python)

信息增益:信息熵和条件熵的差值就是信息增益,主要含义是指期望信息或者信息上的有效减少量,根据他来 确定在什么样的层次上选择什么样的变量来分类。 计算过程我通过一个例子来展现出来 现在 还没有划分...
  • guang_mang
  • guang_mang
  • 2017年05月09日 21:01
  • 878

熵和信息增益

信息论中广泛使用的一个度量标准,称为熵(entropy),它刻画了任意样例集的纯度。给定包含关于某个目标概念的正反样例的样例集S,那么S相对于这个布尔型分类的熵为:     其中,p+代表正样例...
  • xiaoyu714543065
  • xiaoyu714543065
  • 2013年01月21日 10:58
  • 5417

信息增益,信息增益率,Gini

 话说今天《机器学习》上课被很深地打击了,标名为“数据挖掘”专业的我居然连个信息增益的例子都没能算正确。唉,自看书以来,这个地方就一直没有去推算过,每每看到决策树时看完Entropy就直接跳过后...
  • xuxurui007
  • xuxurui007
  • 2014年03月22日 12:11
  • 27375

信息增益与信息增益率详解

熟悉决策树算法的人都知道ID3以及C4.5两种算法,当然也非常清楚信息增益以及信息增益率两个概念。 信息增益:节点M的信息熵E1与其全部子节点信息熵之和E2的差。 信息增益率:节点信息增益与节点分裂信...
  • u013164528
  • u013164528
  • 2015年03月17日 23:45
  • 6510

决策树算法定义,理解,信息增益计算方式

决策树算法:     参考网址:http://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html         通俗来说...
  • iphone4grf
  • iphone4grf
  • 2015年05月29日 14:19
  • 1609

【结合实例】信息增益的计算

参考文章:https://www.cnblogs.com/qcloud1001/p/6735352.html 信息增益原理介绍 介绍信息增益之前,首先需要介绍一下熵的概念,这是一个物理学概念,...
  • guomutian911
  • guomutian911
  • 2017年11月22日 09:53
  • 424

对于熵和信息增益的理解

ID3是利用训练集构建决策树的算法,训练集是一些已知类别的实例(instance)的集合,假设训练集为S={x1,x2,...,xn},每个实例的特征向量为s1=[a1,a2,a3,...,am]。那...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2015年10月27日 11:01
  • 1114
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算信息增益(Information Gain),考虑交叉feature
举报原因:
原因补充:

(最多只允许输入30个字)