Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB kMeans并不总是收敛到全局极小值_Matlab_Machine Learning_Cluster Analysis_K Means - Fatal编程技术网

MATLAB kMeans并不总是收敛到全局极小值

MATLAB kMeans并不总是收敛到全局极小值,matlab,machine-learning,cluster-analysis,k-means,Matlab,Machine Learning,Cluster Analysis,K Means,我在MATLAB中编写了一个算法,我想我应该在kmeans(X,k)中构建的MATLABs上试试 然而,对于非常简单的四簇设置(见图),MATLAB并不总是收敛到最优解(左),而是收敛到(右) 我写的一个也不总是这样,但是内置函数不应该能够解决这样一个简单的问题,总是找到最佳的解决方案吗 k-means算法对聚类中心的初始猜测非常敏感。你用相同的初始质量中心试过这两种代码吗 该算法很简单,我怀疑您的实现与Matlab的实现之间是否存在很大差异。如前所述,K-means算法取决于初始簇质心位置,并

我在MATLAB中编写了一个算法,我想我应该在
kmeans(X,k)
中构建的MATLABs上试试

然而,对于非常简单的四簇设置(见图),MATLAB并不总是收敛到最优解(左),而是收敛到(右)

我写的一个也不总是这样,但是内置函数不应该能够解决这样一个简单的问题,总是找到最佳的解决方案吗


k-means算法对聚类中心的初始猜测非常敏感。你用相同的初始质量中心试过这两种代码吗

该算法很简单,我怀疑您的实现与Matlab的实现之间是否存在很大差异。

如前所述,K-means算法取决于初始簇质心位置,并且不能保证它会收敛到最优解

你能做的最好的事情就是用随机的起点重复实验几次

MATLAB的实现提供了这样一个选项:
复制
,它将聚类重复N次,并选择聚类点到质心距离内总距离最低的一个。 您还可以使用
start
选项控制初始质心的选择方式

此外,MATLAB提供了许多距离度量(欧几里德、曼哈顿、余弦等)的选择。一个整洁的选项
emptyaction
允许您控制当集群在迭代过程中丢失其所有分配的成员时会发生什么


但真正的优势在于它采用了两个阶段的算法:通常的分配-重新计算迭代,然后是在线更新阶段。请务必阅读的算法部分了解更多信息。

您可能经常会对任何特定运行的“k-均值算法”(即劳埃德算法)提出的解决方案感到失望。这是因为劳埃德算法经常陷入糟糕的局部极小值

幸运的是,劳埃德只是解决k-means问题的一种方法。有一种方法几乎总能找到更好的局部极小值

诀窍是一次更新一个数据点的簇分配。通过保持分配给每个平均值的点数
n
,您可以有效地做到这一点。这样,在删除点
x
后,您可以按如下方式重新计算聚类平均值
m

m_new = (n * m - x) / (n - 1)
并使用以下方法将
x
添加到聚类平均值
m

m_new = (n * m + x) / (n + 1)
当然,因为它不能矢量化,在MATLAB中运行有点痛苦,但在其他语言中也不算太糟糕


如果您真的希望获得尽可能好的局部极小值,并且不介意使用基于示例的聚类,那么您应该看看。MATLAB的实现可以在上找到。

虽然不能在一次运行中解决问题,但当它运行N次时(与运行原始的K-Means算法N次相比),它往往会给出更好的结果。

我不认为这是一个容易的问题。:)事实上,维基百科关于“K-Means聚类”的文章对计算复杂性给出了一个相当悲观的描述


如果你想摆脱随机重启(依赖于初始猜测),一个折衷方案是“全局k-均值”算法;论文和matlab代码可以在这里找到:

我想你是对的。为了获得更好的收敛性,我修改了我的算法,对不同的初始质量中心做了几次尝试,然后通过测量簇的方差来确定最佳的。一次尝试中的低均值方差等于紧凑簇。听起来怎么样?@Theodor:这确实是一个可能的标准。是的,我在wiki上读到了关于kMeans++算法的文章,但我不太明白最初的集群是如何启动的。。