繁体   English   中英

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

[英]What algorithms are suitable for this simple machine learning problem?

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

这是基本问题:我反复给出一个新对象和一个关于该对象的描述列表。 例如:new_object: 'bob' 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距离度量计算起来非常昂贵,这就是为什么我使用快速机器学习算法来尝试在实际进行昂贵的计算之前猜测哪些对象将会关闭。

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

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

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

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

弗兰克:['年轻','简短,'有趣']史蒂夫:['高','老','脾气暴躁']乔:['高','老']

因为我正在维持一个有趣的哈希 - > {frank,...},tall - > {steve,joe,...}和old - > {steve,joe,...}

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

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

您可以根据需要使其变得复杂,例如通过包含术语连词的权重。

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

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

为每个人p

对于p中的每个特征

图[T]。新增(P);

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

字典映射名称计数称为cnt

对于我感兴趣的人的每个特质

对于地图中的每个人p [t]

CNT [P] ++;

那么具有最高计数的条目最接近


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

SVM非常快。 特别是LIBSVM for Python提供了支持向量机的非常好的实现,用于分类。

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

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

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

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

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

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

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

你所描述的有点类似于Locally Weighted Learning算法,它给出了一个查询实例,它在邻近实例周围训练一个模型,加权由它们到查询的距离加权。

Weka(Java)在weka.classifiers.lazy.LWL中实现了这一功能

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM