在Java中计算用于选择训练集的互信息

在Java中计算用于选择训练集的互信息,java,machine-learning,bayesian,information-theory,Java,Machine Learning,Bayesian,Information Theory,场景 我试图在JavaGUI应用程序中的数据集上实现监督学习。用户将获得要检查的项目或“报告”列表,并根据一组可用标签对其进行标记。一旦监督学习完成,标记的实例将被提供给学习算法。这将尝试根据用户希望查看的可能性排序其余项目 为了最大限度地利用用户的时间,我想预先选择能够提供关于整个报告集合的最多信息的报告,并让用户对其进行标记。据我所知,要计算这个值,必须找到每个报告的所有互信息值之和,并按该值排序。然后,将使用监督学习的标记报告形成贝叶斯网络,以找到每个剩余报告的二进制值概率 示例 这里

场景


我试图在JavaGUI应用程序中的数据集上实现监督学习。用户将获得要检查的项目或“报告”列表,并根据一组可用标签对其进行标记。一旦监督学习完成,标记的实例将被提供给学习算法。这将尝试根据用户希望查看的可能性排序其余项目

为了最大限度地利用用户的时间,我想预先选择能够提供关于整个报告集合的最多信息的报告,并让用户对其进行标记。据我所知,要计算这个值,必须找到每个报告的所有互信息值之和,并按该值排序。然后,将使用监督学习的标记报告形成贝叶斯网络,以找到每个剩余报告的二进制值概率

示例


这里,一个人工的例子可能有助于解释,并且当我毫无疑问地使用错误的术语时,可能会消除混乱:-考虑一个示例,其中应用程序向用户显示新闻故事。它根据显示的用户偏好选择首先显示哪些新闻故事。具有相关性的新闻故事的特征有

来源国
类别
日期
。因此,如果用户将来自苏格兰的单个新闻故事标记为有趣,那么它会告诉机器学习者,用户对来自苏格兰的其他新闻故事感兴趣的可能性会增加。类似于体育类或日期,如2004年12月12日

可以通过为所有新闻故事选择任意顺序(例如,按类别、按日期)或随机排序,然后根据用户的操作计算偏好来计算此偏好。我想做的是通过让用户查看少量特定的新闻故事,并说出他们是否对它们感兴趣(监督学习部分),从而在排序上获得某种“领先”。要选择哪些故事来展示用户,我必须考虑整个故事集。这就是相互信息的来源。对于每个故事,我想知道当它被用户分类时,它能告诉我多少关于所有其他故事的信息。例如,如果有大量来自苏格兰的故事,我想让用户对其中一个进行分类(至少)。类似于其他相关功能,如类别或日期。目标是找到报告的示例,这些示例在分类时提供了有关其他报告的最多信息

问题


因为我的数学有点生疏,而且我是机器学习的新手,所以在将互信息的定义转换为Java实现时遇到了一些问题。维基百科将相互信息的等式描述为:

然而,我不确定这是否真的可以在没有分类的情况下使用,并且学习算法还没有计算出任何东西

在我的示例中,假设我有大量新的、未标记的此类实例:

public class NewsStory {
    private String countryOfOrigin;
    private String category;
    private Date date;
    // constructor, etc.
}
在我的特定场景中,字段/特征之间的相关性基于精确匹配,因此,例如,一天和10年的日期差在不平等性方面是相等的

相关性因素(例如,日期相关性是否比类别相关性更大?)不一定相等,但它们可以预定义并保持不变。这是否意味着函数
p(x,y)
的结果是预定义值,还是我混淆了术语

问题(最后)


鉴于这个(假)新闻故事的例子,我如何实现互信息计算?库、javadoc、代码示例等都是受欢迎的信息。此外,如果这种方法存在根本性缺陷,那么解释为什么会出现这种情况也同样有价值



另外,我知道像Weka和ApacheMahout这样的库,所以仅仅提到它们对我来说并不是很有用。我仍然在搜索这两个库的文档和示例,专门寻找关于相互信息的内容。真正对我有帮助的是指向资源(代码示例,javadoc),其中这些库有助于相互信息。

我只知道与决策树(DTs)相关的信息增益,在构建DT时,每个节点上的拆分是最大化信息增益的。DTs是在Weka中实现的,所以您可能可以直接使用它,尽管我不知道Weka是否允许您计算DT节点下任何特定拆分的信息增益


除此之外,如果我理解正确的话,我认为你所做的通常被称为。在这里,您首先需要一些初始标记的训练数据,这些数据被提供给您的机器学习算法。然后,将分类器标记为一组未标记的实例,并返回每个实例的置信值。置信值最低的实例通常是信息量最大的实例,因此您将这些实例显示给人类注释者,并让他/她手动标记这些实例,将它们添加到您的训练集中,重新训练分类器,然后一遍又一遍地重复整个过程,直到您的分类器具有足够高的精度,或者直到满足其他停止标准。因此,如果这对您有效,原则上您可以使用在Weka或任何其他ML框架中实现的任何ML算法,只要您选择的算法能够返回置信值(在贝叶斯方法的情况下,这只是概率)


通过你编辑的问题,我想我开始明白你的目的了。如果你想要的是计算MI,那么StompChicken的答案和pseudo

class Example
{ String f1;
  String f2;
}

Example e1 = new Example("foo", "bar");
Example e2 = new Example("foo", "baz");
mi = 0 for each value x taken by f1: { sum = 0 for each value y taken by f2: { p_xy = number of examples where f1=x and f2=y p_x = number of examples where f1=x p_y = number of examples where f2=y sum += p_xy * log(p_xy/(p_x*p_y)) } mi += sum }