Machine learning 在查找k簇时,另一个比肘部更有用的函数

Machine learning 在查找k簇时,另一个比肘部更有用的函数,machine-learning,data-mining,k-means,Machine Learning,Data Mining,K Means,我试图为机器学习中的k-means方法找到合适的k类。我使用了肘部方法,但它耗时且复杂度高。谁能告诉我另一种方法来代替它吗。非常感谢可以用来评估聚类结果的一个指标是。该值基本上计算: silhouette coefficient = 1 - (intra-cluster cohesion) / (inter-cluster separation) 该值的范围为-1到+1,但通常希望值接近1.0。因此,如果您运行聚类算法(例如k-means或分层聚类)来生成3个聚类,您可以调用轮廓库来计算轮廓系

我试图为机器学习中的k-means方法找到合适的k类。我使用了肘部方法,但它耗时且复杂度高。谁能告诉我另一种方法来代替它吗。非常感谢

可以用来评估聚类结果的一个指标是。该值基本上计算:

silhouette coefficient = 1 - (intra-cluster cohesion) / (inter-cluster separation)
该值的范围为-1到+1,但通常希望值接近1.0。因此,如果您运行聚类算法(例如k-means或分层聚类)来生成3个聚类,您可以调用轮廓库来计算轮廓系数值,例如0.50。如果再次运行算法以生成4个簇,则可以计算另一个轮廓系数值,例如0.55。然后您可以得出结论,4个簇是更好的簇,因为它具有更高的轮廓系数

下面是一个示例数据集,我使用R在二维空间中创建了三个不同的簇。注意:在簇之间如此明显的分离情况下,真实世界的数据看起来永远不会如此干净。即使是像Fisher的虹膜数据集这样的简单数据,在标记的簇之间也有重叠

plot(silhouette(kmeans(df, centers=2)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=3)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=4)$cluster, dist(df)))

然后可以使用R的轮廓库来计算轮廓系数。(可以找到更多信息。)下面是轮廓信息的曲线图。您需要的一个指标位于左下角,上面写着“平均轮廓宽度:xxx”。该值是所有水平杆的平均值

这是K=2簇的轮廓系数

plot(silhouette(kmeans(df, centers=2)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=3)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=4)$cluster, dist(df)))

这是K=3簇的轮廓系数

plot(silhouette(kmeans(df, centers=2)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=3)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=4)$cluster, dist(df)))

这是K=4簇的轮廓系数

plot(silhouette(kmeans(df, centers=2)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=3)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=4)$cluster, dist(df)))

通过观察轮廓系数,可以得出结论,K=3簇是最好的簇,因为它具有最高的轮廓系数

您可以通过编程方式找到最佳K值,只需扫描多个候选K值(例如,2到10之间),同时跟踪找到的最高轮廓系数。下面我做了这件事,同时还绘制了轮廓系数(y轴)与K(x轴)的曲线图。结果显示:

最佳轮廓系数=0.888926出现在k=3时

library(cluster)#用于轮廓
图书馆(ggplot2)#用于ggplot
图书馆(天平)#用于漂亮的休息
#使用点(1,1)、(2,4)和(3,1)周围的簇创建示例二维数据集

x可用于评估聚类结果的指标是。该值基本上计算:

silhouette coefficient = 1 - (intra-cluster cohesion) / (inter-cluster separation)
该值的范围为-1到+1,但通常希望值接近1.0。因此,如果您运行聚类算法(例如k-means或分层聚类)来生成3个聚类,您可以调用轮廓库来计算轮廓系数值,例如0.50。如果再次运行算法以生成4个簇,则可以计算另一个轮廓系数值,例如0.55。然后您可以得出结论,4个簇是更好的簇,因为它具有更高的轮廓系数

下面是一个示例数据集,我使用R在二维空间中创建了三个不同的簇。注意:在簇之间如此明显的分离情况下,真实世界的数据看起来永远不会如此干净。即使是像Fisher的虹膜数据集这样的简单数据,在标记的簇之间也有重叠

plot(silhouette(kmeans(df, centers=2)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=3)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=4)$cluster, dist(df)))

然后可以使用R的轮廓库来计算轮廓系数。(可以找到更多信息。)下面是轮廓信息的曲线图。您需要的一个指标位于左下角,上面写着“平均轮廓宽度:xxx”。该值是所有水平杆的平均值

这是K=2簇的轮廓系数

plot(silhouette(kmeans(df, centers=2)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=3)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=4)$cluster, dist(df)))

这是K=3簇的轮廓系数

plot(silhouette(kmeans(df, centers=2)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=3)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=4)$cluster, dist(df)))

这是K=4簇的轮廓系数

plot(silhouette(kmeans(df, centers=2)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=3)$cluster, dist(df)))
plot(silhouette(kmeans(df, centers=4)$cluster, dist(df)))

通过观察轮廓系数,可以得出结论,K=3簇是最好的簇,因为它具有最高的轮廓系数

您可以通过编程方式找到最佳K值,只需扫描多个候选K值(例如,2到10之间),同时跟踪找到的最高轮廓系数。下面我做了这件事,同时还绘制了轮廓系数(y轴)与K(x轴)的曲线图。结果显示:

最佳轮廓系数=0.888926出现在k=3时

library(cluster)#用于轮廓
图书馆(ggplot2)#用于ggplot
图书馆(天平)#用于漂亮的休息
#使用点(1,1)、(2,4)和(3,1)周围的簇创建示例二维数据集

所有这些统计数据往往只在数据表现良好时才起作用,几乎不在真实数据上。原因很简单:它们对预处理也很敏感。不幸的是,底线是,您无法使用它们来自动化集群。所有这些统计数据往往只在数据表现良好时才起作用,几乎不在真实数据上。原因很简单:它们对预处理也很敏感。不幸的是,底线是,您无法使用它们来自动化集群。感谢您的回复。谢谢你的回复。这很有帮助