首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么样的算法适合这个简单的机器学习问题?

什么样的算法适合这个简单的机器学习问题?
EN

Stack Overflow用户
提问于 2010-03-25 22:54:07
回答 6查看 4K关注 0票数 13

我有一个我认为是简单的机器学习问题。

这是一个基本的问题:反复给我一个新的对象和关于这个对象的描述列表。例如: new_object:'bob' new_object_descriptions:['tall','old','funny']。然后,我必须使用某种机器学习来查找以前处理过的对象,这些对象具有10个或更少类似的描述,例如,past_similar_objects:['frank','steve','joe']。接下来,我有一个算法,可以直接测量这些对象是否确实与bob类似,例如,correct_objects:['steve','joe']。然后给分类器提供成功匹配的反馈训练。然后,这个循环用一个新的对象重复。A这是伪码:

代码语言:javascript
复制
Classifier=new_classifier()

while True:
    new_object,new_object_descriptions = get_new_object_and_descriptions()
    past_similar_objects = Classifier.classify(new_object,new_object_descriptions)
    correct_objects = calc_successful_matches(new_object,past_similar_objects)
    Classifier.train_successful_matches(object,correct_objects)

但是,有一些规定可能限制可以使用的分类器:

  • 该分类器中将有数百万个对象,因此分类和训练需要很好地扩展到数百万个对象类型,并且仍然是快速的。我认为这会使类似垃圾邮件分类器这样的东西失去资格,而这种分类器只适合于两种类型:垃圾邮件或不垃圾邮件。(更新:如果有问题的话,我可能可以将其缩小到数千个对象,而不是数百万个对象。)
  • 再一次,我更喜欢速度,当数百万物体被分类,而不是精确。
  • 更新:根据过去训练的反馈,分类器应该返回10个(或更少的)最相似的对象。没有这个限制,一个明显的欺骗是因为分类器可以返回所有过去的对象:)

有什么像样的,快速的机器学习算法来达到这个目的?

注意:计算calc_successful_matches距离是非常昂贵的,这就是为什么我在进行昂贵的计算之前,使用快速机器学习算法来猜测哪些对象是接近的。

EN

回答 6

Stack Overflow用户

发布于 2010-03-26 02:21:55

一个似乎符合您的要求的算法(并且可能类似于统计学家John的建议)是语义散列。它的基本思想是训练一个深度信念网络(一种神经网络,有些人称之为“神经网络2.0”,目前是一个非常活跃的研究领域),将对象描述列表中的散列创建为二进制数,以便数字之间的汉明距离对应于类似的对象。因为这只需要按位操作,它可以非常快,而且由于您可以使用它创建最近的邻居风格的算法,它自然地概括到非常多的类。这是非常好的艺术状态的东西。缺点:理解和实现并不简单,需要进行一些参数调整。给出了一些Matlab代码这里。局部性敏感散列是一种比较容易实现并与此密切相关的算法。

既然你说你有一个昂贵的距离函数,你想要快速逼近,我想起了另一个非常有趣的算法,它是这样做的,Boostmap。这个方法使用增强来创建一个快速的度量,它近似于一个昂贵的计算度量。从某种意义上说,它与上面的思想相似,但所使用的算法不同。这篇论文的作者有几篇关于相关技术的论文,所有这些都是相当好的质量(发表在顶级会议上),您可能想看看。

票数 9
EN

Stack Overflow用户

发布于 2010-03-25 23:38:00

您可以使用向量空间模型(模型)。我认为,你想要学习的是,在考虑两个对象描述向量彼此之间有多近时,如何加权项,例如,根据一个简化的互信息。这可能非常有效,因为您可以从术语到向量进行散列,这意味着您不必比较没有共享功能的对象。朴素模型将有一个可调整的权重每项(这既可以是每一个向量,每项整体,或两者),以及一个阈值。向量空间模型是一种广泛使用的技术(例如,在Apache中,您可能会使用它来解决这个问题),所以您可以通过进一步的搜索了解很多关于它的信息。

让我就你的例子给出一个非常简单的表述。给鲍勃:‘高’,‘老’,‘有趣’,我检索

弗兰克:“年轻”、“矮小”、“滑稽”史蒂夫:“高”、“老”、“脾气暴躁”乔:“高”、“老”

因为我正在维护一个有趣的散列({frank,},tall->{steve,joe,.},and ->{steve,joe,.}

我计算的内容类似于总体相互信息:共享标记的权重/bob标记的权重。如果这个权重超过了阈值,我就把它们包括在列表中。

在训练时,如果我犯了一个错误,我会修改共享标记。如果我的错误包括了弗兰克,我减少重量的滑稽,而如果我犯了一个错误,不包括史蒂夫或乔,我增加了体重的高个子和老人。

你可以用你想要的复杂的方法来实现,例如,包括术语连词的权重。

票数 3
EN

Stack Overflow用户

发布于 2010-03-26 01:05:19

你真的需要一个机器学习算法吗?你的相似性标准是什么?您已经提到了对象数量的维度,那么每个人的特征集的大小呢?是否有最大数量的特征类型?我可能会尝试这样的方法:

1)将字典映射特性映射到名为map的名称列表

每一个人p

对于p中的每个性状t

mapt.add(p);

2)然后,当我想找到最接近的人时,我会拿起我的字典,创建一本新的临时词典:

将名称映射为计数的字典称为cnt

对于我感兴趣的人身上的每一个特征

对于mapt中的每个人p

cntp++;

则具有最高计数的条目最接近。

这里的好处是地图只创建了一次。如果每个人的性状很小,而且可用的性状类型很大,那么算法应该是快速的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2520018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档