<强>方案


我试图在数据的Java GUI应用程序中设置来实现监督学习。用户将获得项目或“报告”的名单进行检查,并根据一组可用标签将标签他们。一旦监督学习完成后,标记的情况下将被赋予一个学习算法。这将尝试订购其余项目上有多大的可能性,用户将想查看它们。

要获取用户的时候最想预先选择的报告将提供有关报告的整个集合最多的信息,并让用户对其进行标记。据我了解,计算出这一点,就必须找到所有为每个报表的交互信息值的总和,并通过该值排序。从监督的学习标记报告将被用于形成贝叶斯网络以找到每个剩余报告的二进制值的概率。

示例


在这里,一个人为的例子可能有助于解释,并且可以清理混乱的时候,我无疑是使用了错误的术语:-)考虑这样的应用程序显示新闻报道给用户一个例子。它选择的新闻故事,以基于显示的用户的喜好首先显示的。其中有一个相关的新闻报道的特点是country of origincategorydate。因此,如果用户标记一个新闻故事,有趣的,当它从苏格兰来了,它告诉机器学习是有一个从苏格兰的机会增加其他新闻报导将是用户感兴趣的。要类别,例如体育,或日期,例如类似2004年12月12日

此优先可以通过选择所有的新闻故事任何顺序(例如按类别,按日期)或随机地排序它们,然后在用户进入沿着计算的偏好来计算。我想这样做的是通过让用户看少数特定的新闻故事,并说,如果他们有兴趣他们(监督学习的部分)得到的是一种“先声夺人”上订购的。选择哪个故事展现用户,我要考虑故事的整个集合。这就是互信息进来。对于每一个故事,我想知道多少能告诉我其他所有的故事,当它被用户分类。例如,如果有大量来自苏格兰起源的故事,我想获得用户进行归类(至少)之一。类似的其他相关功能,如类别或日期。的目标是找到的报告实例,被分类时,提供关于其他报告最多的信息。

<强>问题


由于我的数学是有点生疏了,我是新来的机器学习,我遇到了一些麻烦互信息的定义转换成Java中的实现。维基百科描述了一种用于互信息的方程为:

“互信息方程”

不过,我不能确定什么时候已被归类这个实际上可以使用,学习算法还不算什么呢。

如在我的例子,说我有大量此类的新,未标记的实例:

public class NewsStory {
    private String countryOfOrigin;
    private String category;
    private Date date;
    // constructor, etc.
}

在我的特定情况下,场/功能之间的关系是基于精确匹配的话,比如,一天,10年的时间差在他们的不平等等同。

用于相关的因素(例如是比日期类别更相关?)不一定相等,但它们可以被预定义并且是恒定的。这是否意味着功能p(x,y)结果的的预定义值,还是我混淆了条件?

<强>问题(最终)


我该如何去实现给定的新闻报导的这(假冒)例如互信息计算?图书馆,javadoc的,代码示例等都是欢迎信息。另外,如果这种方法基本上是错误的,解释为什么是这样的话会同样有价值的答案。


PS。我知道库,如Weka的和Apache Mahout的,所以只是提它们是不是真的对我非常有用。我仍然可以通过文档和示例对这两个库搜索寻找互信息的东西特别。怎样才是真正帮我指着资源(代码示例,javadoc中),其中这些库互信息帮助。

有帮助吗?

解决方案

我猜测你的问题是一样的东西......

“鉴于未标记的示例的列表,排序多少如果用户标记的例子和它添加到该训练集合中的模型的预测精度将提高该列表。”

如果是这样的话,我不认为双方的信息是使用,因为你不能两个实例之间计算MI正确的事情。 MI的定义是在随机变量方面和一个单独的实例不是一个随机变量,它只是一个值。

的特征和类标记物可以是,虽然作为随机变量。也就是说,他们具有价值的整个数据集的分布。你可以计算的互信息两个特征之间,怎么看“多余”一个特征赋予对方一个,或特征与类别标签之间,得到的多少该功能可以帮助预测的想法。这就是人们通常在监督学习问题,使用相互的信息。

我觉得你看主动学习方法ferdystschenko的建议是一个很好的一个。


在回应Grundlefleck的评论,我会去成深一点的术语用他的Java对象类比的想法......

总之,我们已经使用了“实例”项,“东西”,“报告”和“实例”来指代对象被clasified。让我们自己的事情,作为一个Java类的实例(我已经离开了样板构造函数):


class Example
{ String f1;
  String f2;
}

Example e1 = new Example("foo", "bar");
Example e2 = new Example("foo", "baz");

在机器学习通常的术语是E1是例如是,所有实施例中有两个功能 f1和f2以及对E1,F1采用值“富'和f2取值‘酒吧’。的示例的集合被称为数据集

取f1的所有值在数据集中的所有实施例中,这是一个字符串列表,它也可以被认为是一个分布。我们可以把该特征作为一个的随机变量并且在列表中的每个值是从该随机变量所取的样品。因此,我们可以,例如,计算f1和f2之间的MI。伪代码会是这样的:

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
}

但是你不能E1和E2之间计算MI,它只是没有定义的方式。

其他提示

我知道信息获得仅与决策树(DTS),其中,在DT中,分割,使每个节点上的构造是最大化信息增益的一个连接。 DTS为在Weka中实现的,所以你很可能使用的是直接的,虽然我不知道的Weka让你计算信息增益为DT节点下的任何特定的分裂。

除此之外,如果我理解正确的话,我觉得你想要做什么是通常被称为的主动学习。在那里,你首先需要送到了你的机器学习算法一些初始标记的训练数据。然后,你有你的分类标签一组未标记的实例,并为他们每个人返回置信度值。最低的置信度值实例通常这是最翔实的的,所以你展示这些给人类注释,让他/她的标签,这些手工,将它们添加到您的训练集,重新训练你的分类,并在做整个事情,一遍又一遍,直到你的分类有足够高的精度,或者直到一些其他的停止条件满足。因此,如果这对你的作品,你可以在原则上使用了Weka或任何其他ML-框架,只要你选择的算法能够恢复信心值实现的任何ML算法(在案件的贝叶斯方法,这将是只是概率)


通过您编辑的问题,我想我来了解你想做什么。如果你想被计算MI,然后StompChicken的回答和伪代码不能在我看来,更清晰的内容。我还认为,MI是不是你想要的,你正在试图重新发明轮子。

让我们概括:你想训练可以由用户更新的分类。这是一个主动学习的经典案例。但对于这一点,你需要一个初始分类器(你可以基本上只是给用户的随机数据标记,但我把它这是不是一种选择),并以培养您最初的分类,你至少需要标记的训练一些少量的为监督学习的数据。然而,所有你必须是未标记的数据。你可以用这些做什么?

那么,你可以集群他们进入相关实例组,采用标准的一个通过提供的Weka聚类算法或某些特定的聚类工具如 CLUTO 。现在,如果你每个集群的x最核心的情况下(X取决于集群的数量和用户的耐心),并让用户将其标示为感兴趣或不感兴趣,你可以通过这个标签的其他实例该群集以及(或至少为中央的)。瞧,现在你有,你可以用它来训练你的初始分类,并通过每个用户标志着一个新的实例作为有趣的或者不是时间更新分类揭开序幕,主动学习过程的训练数据。我想你想要什么,通过计算MI的情况非常相似,但实现可能只为你充错了车。

不知道您的方案的细节,我想你可能甚至不需要任何标记的任何数据,除非你有兴趣标签本身。只要集群数据一次,让用户从所有群集的中央成员挑对他有意思的项目/她,并建议从被选择的群其他项目也许是有趣的为好。另外这里还有推荐其他集群一些随机的情况下,因此,如果用户选择其中的一个,你可以假设相应的群集通常可能是有趣的。如果有矛盾,用户喜欢集群,但一些成员没有T中的一个相同的一些人,那么你尝试将数据重新聚集成区分坏的好细粒度的群体。重新训练步骤甚至可以通过使用从开始分层聚类和向下行进的群集分层结构在每一个矛盾的用户输入引起被避免。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top