gpt4 book ai didi

java - 计算相互信息以选择Java中的训练集

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:50 27 4
gpt4 key购买 nike

场景

我正在尝试对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对象类比的思想来更深入地介绍术语。

我们共同使用术语“实例”,“事物”,“报告”和“示例”来指代被分类的对象。让我们将这些东西视为Java类的实例(我省略了样板构造器):


class Example
{ String f1;
String f2;
}

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

机器学习中常用的术语是e1是一个示例,所有示例都具有两个特征f1和f2,对于e1,f1取值'foo',而f2取值'bar'。示例的集合称为数据集。

对于数据集中的所有示例,取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,只是没有这样定义。

关于java - 计算相互信息以选择Java中的训练集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2002521/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com