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

时间:2010-03-25 22:54:08

标签: python artificial-intelligence machine-learning classification neural-network

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

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

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距离指标的计算成本非常高,这就是为什么我在使用昂贵的计算之前使用快速机器学习算法来猜测哪些对象将会关闭。

8 个答案:

答案 0 :(得分:9)

似乎符合您要求的算法(可能与统计学家John建议的类似)是Semantic Hashing。基本思想是它训练一个深层次的信念网络(一种神经网络,有些人称之为“神经网络2.0”,现在是一个非常活跃的研究领域)来创建一个对象描述列表的哈希值。二进制数使得数字之间的汉明距离对应于相似的对象。由于这只需要按位操作,因此它可以非常快,并且由于您可以使用它来创建最近邻风格的算法,因此它自然地推广到非常多的类。这是非常好的先进技术。缺点:理解和实施并不简单,需要进行一些参数调整。作者提供了一些Matlab代码here。一种更容易实现的算法,与此密切相关的是Locality Sensitive Hashing。

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

答案 1 :(得分:3)

您可以使用向量空间模型(http://en.wikipedia.org/wiki/Vector_space_model)。我认为你要学习的是如何在考虑两个对象描述向量彼此之间的距离时如何加权,例如在简化的互信息方面。这可能非常有效,因为您可以从术语哈希到向量,这意味着您不必比较没有共享功能的对象。然后,幼稚模型每个术语具有可调整的权重(这可以是每个术语每个术语,每个术语总体,或两者),以及阈值。向量空间模型是一种广泛使用的技术(例如,在Apache Lucene中,您可能可以用于此问题),因此您将能够通过进一步搜索找到很多相关信息。

让我根据你的例子给出一个非常简单的表述。鉴于bob:['tall','old','funny'],我检索

坦率地说:['年轻','简短,'有趣'] 史蒂夫:['高','老','脾气暴躁'] 乔:['高','老']

因为我正在维护一个哈希来自funny-> {frank,...},tall-> {steve,joe,...}和old-> {steve,joe,...}

我计算了整体互信息:共享标签的重量/鲍勃标签的重量。如果该权重超过阈值,我将它们包含在列表中。

培训时,如果我犯了错误,我会修改共享标签。如果我的错误包括坦率,我减轻了有趣的重量,而如果我犯了一个错误,不包括史蒂夫或乔,我增加了高大和老的重量。

您可以根据需要将其设置为复杂,例如通过包含术语连词的权重。

答案 2 :(得分:3)

你真的需要机器学习算法吗?您的相似度量是多少?您已经提到了对象数量的维数,每个人的特征集大小如何?是否有最大数量的特质类型?我可能会尝试这样的事情:

1)将字典映射到名为map

的名称列表

每个人p

对于p

中的每个特征

图[T]。新增(P);

2)然后当我想找到最亲近的人时,我会拿我的字典并创建一个新的临时字符:

字典映射名称计数称为cnt

对于我感兴趣的人中的每个特征

为地图[t]

中的每个人p

CNT [P] ++;

然后具有最高计数的条目最接近


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

答案 3 :(得分:2)

SVM非常快。特别是Python的LIBSVM为支持向量机提供了非常不错的分类实现。

答案 4 :(得分:1)

该项目以两种显着的方式脱离典型的分类应用程序:

  • “分类器”不是输出新对象被认为属于的类(或者可能输出这些类的数组,每个类具有概率/置信度),而是提供“关闭”的“邻居”列表。足够“对新对象。
  • 对于每个新分类,独立于分类器的目标函数提供正确的“邻居”列表;然后使用校正后的列表(分类器提供的列表的子集?)来训练分类器

第二点背后的想法可能是提交给分类器的未来对象与当前对象相似应该得到更好的“分类”(与更正确的一组先前看过的对象相关联),因为正在进行的训练重新强制连接到正(正确)匹配,同时削弱与分类器最初出错的对象的连接。

这两个特征引入了明显的问题   - 输出是对象列表而不是“原型”(或类别的类别标识符)的事实使得难以扩展,因为到目前为止看到的对象数量朝着问题中建议的数百万个实例增长。登记/>   - 训练是在分类器找到的匹配的子集的基础上完成的,这可能会引入过度拟合,从而分类器可能变得“盲目”到它的特征(维度)在训练的早期阶段,不小心,没有重要性/相关性。 (关于产生“正确”对象列表的目标函数,我可能会假设太多)

可能通过两步过程来处理缩放问题,使用第一个分类器,基于K-Means算法或类似的东西,这将生成整个对象集合的子集(先前看到的对象)作为当前对象的合理匹配(有效地过滤掉70%或更多的集合)。然后,可以在矢量空间模型的基础上评估这些可能的匹配(如果特征维度基于因子而不是值,则特别相关)或一些其他模型。这个两步过程的基本假设是对象集合将有效地暴露集群(它可能只是沿着各个维度相对均匀地分布)。

进一步限制评估候选者数量的另一种方法是,随着之前看到的对象的大小增加,删除近似重复项并仅与其中一个进行比较(但要在结果中提供完整的重复列表,假设如果新对象接近这个近似重复类的“代表”,则该类的所有成员也将匹配)

过度拟合的问题难以处理。一种可能的方法是[有时]随机地将对象添加到分类器通常不包括的匹配列表中。可以根据它们与新物体的距离相对距离来添加额外的物体(即,使相对较近的物体添加的可能性更大)

答案 5 :(得分:1)

您描述的内容有点类似于Locally Weighted Learning算法,该算法给出了一个查询实例,它在邻近实例周围训练一个模型,并通过它们与查询的距离加权。

Weka(Java)在weka.classifiers.lazy.LWL

中实现了这一功能

答案 6 :(得分:0)

可以使用深度学习。 http://www.deeplearning.net/tutorial/只需浏览此链接

答案 7 :(得分:0)

您可能想研究一下Google的AutoML,它将抽象出模型架构并仅给出最终结果。

https://www.youtube.com/watch?v=Kfg62KTH9W0

相关问题