Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.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
Python 用PyCluster优化K(理想簇)_Python_C_Machine Learning_Scipy_K Means - Fatal编程技术网

Python 用PyCluster优化K(理想簇)

Python 用PyCluster优化K(理想簇),python,c,machine-learning,scipy,k-means,Python,C,Machine Learning,Scipy,K Means,我正在使用PyCluster的kMeans对一些数据进行集群,这主要是因为SciPy的kMeans2产生了一个无法克服的错误。无论如何,PyCluster kMeans工作得很好,我现在正试图优化kMeans集群的数量。PyCluster附带的文献表明,我可以通过实现EM算法来优化其kMeans——但我找不到一个例子 有人能给我指出一个PyCluster k-means优化问题吗?提前感谢您的帮助。PyCluster手册提到的优化问题与您所问的不同。当您询问如何确定最佳群集数量时,手册将介绍如何

我正在使用PyCluster的kMeans对一些数据进行集群,这主要是因为SciPy的kMeans2产生了一个无法克服的错误。无论如何,PyCluster kMeans工作得很好,我现在正试图优化kMeans集群的数量。PyCluster附带的文献表明,我可以通过实现EM算法来优化其kMeans——但我找不到一个例子


有人能给我指出一个PyCluster k-means优化问题吗?提前感谢您的帮助。

PyCluster手册提到的优化问题与您所问的不同。当您询问如何确定最佳群集数量时,手册将介绍如何在给定群集总数的情况下找到最佳群集。要理解的概念是k-均值,这是一种EM期望最大化问题算法,不保证最优聚类解决方案,其中最优聚类解决方案可定义为使每个数据点之间距离的平方和与其聚类平均值之和最小的聚类分配。k-means的工作方式如下:

set cluster means to equal k randomly generated points
while not converged:
     # expectation step:
     for each point:
          assign it to its expected cluster (cluster whose mean it is closest to)
     # maximization step:
     for each cluster:
          # maximizes likelihood for cluster mean
          set cluster mean to be the average of all points assigned to it
k-means算法将在给定初始化的情况下输出最佳解,但它不一定会在全局范围内找到最佳聚类解。这就是手册第13页底部所指的内容。手册中说,kcluster例程将多次执行EM,这正是k-means算法,并选择最佳聚类。它从来没有提到寻找最佳聚类数的问题

也就是说,您可以使用一些启发式方法来确定最佳聚类数,例如:

也许最简单的方法就是设置k=sqrtn/2,这通常被认为是最优的。 另一种方法是将数据分成两部分,一个训练集可能是数据的前90%,一个测试集可能是数据的最后10%。这两个集合都应该代表整个数据集合,因此您可能需要事先使用random.shuffle或random.sample。仅使用训练集,就可以应用k-means聚类来查找集群分配,从中可以推断每个集群的平均值。然后,使用测试数据集,计算每个数据点与其指定簇的平均值之间距离的平方和。最后,如果您绘制集群数量与测试错误的对比图,您可能会发现在k的某个值之后,错误将开始增加,或者至少停止减少。然后可以选择发生这种情况的k。测试数据集的使用将有助于确保通过训练生成的聚类能够代表实际的数据集,而不是样本中的特定训练集。如果有n个训练数据点和n个聚类,当然可以在训练集上获得一个完美的聚类,但是测试集的错误可能仍然很大。 或者你可以尝试更一般的高斯混合模型。在混合高斯模型中,有k个高斯分布,N_1,…,N_k,以权重c_1,…,c_k出现,其中c_1+…+c_k=1。从高斯N_i中以概率c_i绘制数据点。k-均值是高斯混合模型的一种特殊类型,其中假设每个高斯都是协方差相等且所有权重相等的球形。这个模型的一个优点是,如果你看到一些c_i非常小,那么高斯峰可能不是一个真正的簇。为了降低复杂性和过度拟合的风险,您可以将高斯约束为球形或具有相等的协方差,这为您提供了一种聚类机制,其行为几乎类似于k-均值,只是它显示了每个聚类的重要性。
也许你想读懂集群方差和差距统计:好吧,你很聪明;非常感谢。如果我投赞成票,我会投的。接下来的一个问题是:这些启发式方法是否适用于您理解的文本文档?或者换一种说法,在对文档进行聚类时是否有推荐的启发式方法?据我所知,在对文档进行聚类时,首先根据术语/术语频率对每个文档进行矢量化,例如,使用tf idf粗略估计文档的主题,但如果每个文档都是相同的10000个副本,例如,我认为您只需要一个聚类,然而,类似经验法则的启发式方法会推荐更多的集群。因此,假设我的直觉是正确的,您是否知道或推荐文档聚类的特定启发式方法?再次感谢。ps:我们切换到SciKit学习包b/c,它似乎更适合我们正在尝试的工作。不知道这是否会影响你的分析,但以防万一。再次感谢您,丁先生。我对文本挖掘的了解不多,但我的基本直觉是,由于文档是高维的 虽然不确定您考虑使用tf idf的单词数,但可能超过10个?,但k-means本身并不适合这个问题。一般来说,k-means对你来说并不好。如果您还没有使用PCA或其他降维算法来首先处理数据,则应该这样做。我还将考虑基于朴素贝叶斯、HAC或潜在Dirichlet分配的Autoclass。实际上,它是由文档分析驱动的,但是它没有在SCI工具包中实现。文中提到的潜在语义索引似乎也是一个好主意,numpy具有所需的奇异值分解功能来降维;在应用LSI之后,您可以应用k-means。HAC是一种简单的算法,不受维数灾难的影响,并在sci工具包中实现,但运行时间要长得多。