有两个类,我们将它们称为X和O.属于这些类的许多元素在xy平面中展开。下面是两个类不可线性分离的示例。无法绘制直线,在线的每一侧完美地划分X和Os。
一般来说,如何确定两个类是否可线性分离?。我对一种算法感兴趣,该算法不对元素的数量或它们的分布做出假设。 最低计算复杂度的算法当然是首选。
答案 0 :(得分:16)
如果你分别找到X
点和O
点的凸包(即你在这个阶段你有两个独立的凸包),你只需要检查是否有任何段船体相交或船体是否被另一个船体封闭。
如果发现两个船体完全不相交,则两个数据集在几何上是可分离的。
由于船体根据定义是凸的,因此任何分隔线都是直线。
有一些有效的算法可用于查找凸包(qhull算法基于我认为的O(nlog(n))
quickhull方法),并执行直线对一组段的交集测试(O(nlog(n))
处的sweepline),总体而言,似乎应该可以使用有效的O(nlog(n))
算法。
此类方法还应通过形成凸包并对每个组执行相交测试,推广到一般k-way
分离测试(其中您有k
个对象组)。
它也应该在更高的维度上工作,尽管交叉测试将开始变得更具挑战性......
希望这有帮助。
答案 1 :(得分:5)
计算上决定两组点是否可线性分离的最有效方法是应用linear programming。 GLTK非常适用于此目的,几乎每种高级语言都为它提供了接口 - R,Python,Octave,Julia等。
假设您有一组A和B点:
然后,您必须在以下条件下最小化0:
(下面的A是矩阵,而不是上面的点集)
“最小化0”实际上意味着您不需要实际优化目标函数,因为没有必要确定这些集是否可线性分离。
最后 ()正在定义分离平面。
如果您对R中的工作示例或数学详细信息感兴趣,请检查this。
答案 2 :(得分:3)
这是一个天真的算法,我确信它会起作用(如果是这样的话,表明问题不是NP完全的,正如另一篇文章所声称的那样),但如果可以做到的话,我不会感到惊讶更有效:如果存在分离线,则可以移动并旋转它直到它碰到两个X'或一个X和一个O.因此,我们可以简单地查看与两个X'相交的所有可能的线。 es或一个X和一个O,看看它们中是否有任何分界线。因此,对于每个 O(n ^ 2)对,迭代所有 n-2 其他元素,看看是否所有X'都在一侧,所有的O都在另一方面。总时间复杂度: O(n ^ 3)。
答案 3 :(得分:3)
如果存在线性感知器,则保证找到这种分离。
答案 4 :(得分:3)
计算线性SVM然后确定计算平面的哪一侧具有每个点所处的最佳边缘将告诉您这些点是否可线性分离。
这太过分了,但是如果你需要一个快速的一次性解决方案,那么有很多现有的SVM库会为你做这件事。
答案 5 :(得分:3)
您可以将linear programming应用于此问题。我不确定其在形式上的计算复杂性,但该技术已成功应用于涉及广泛领域的非常大的问题。
答案 6 :(得分:1)
正如ElKamina所提到的,如果存在线性Perceptron,它将保证找到解决方案。这种方法对于大尺寸而言效率不高。计算上决定两组点是否可线性分离的最有效方法是应用线性规划。
带有在Matlab中使用Perceptron解决的示例的代码是here
答案 7 :(得分:0)
一般这个问题是NP难的,但有很好的近似解决方案,如K-means clustering。
答案 8 :(得分:0)
好吧,Perceptron和SVM(支持向量机)都可以判断两个数据集是否线性可分离,但是SVM可以找到可分离性的最佳高平面。此外,它不仅可以处理点,还可以处理n维向量。
它用于面部识别等应用程序。我建议深入探讨该主题。