我有一个问题,我有一组数字,例如。
5,7,7,8,8,8,7,20,23,23,24,24,24,25
在上面的集合中,有两个数字“集群”,我想编写一个程序来查找这些集群的中心。你能像分形理论一样称它们为吸引子吗?
因此,我认为该程序会发现该集合可以分为两个:
A - 5,7,7,8,8,8,7
B - 20,23,23,24,24,24,25
设置A可以平均计算,设置B可以计算其平均值然后我有两个吸引子中心。
对于一个优秀的数学/统计人员来说,这可能是一个简单的问题?谁能指出我正确的方向? 我可能有1到5个“吸引子/簇”。
答案 0 :(得分:3)
例如,k-means clustering中的R会产生以下结果:
R> x <- c(5, 7, 7, 8, 8, 8, 7, 20, 23, 23, 24, 24, 24, 25)
R> kmeans(as.matrix(x), centers=2)
K-means clustering with 2 clusters of sizes 7, 7
Cluster means:
[,1]
1 23.286
2 7.143
Clustering vector:
[1] 2 2 2 2 2 2 2 1 1 1 1 1 1 1
Within cluster sum of squares by cluster:
[1] 15.429 6.857
Available components:
[1] "cluster" "centers" "withinss" "size"
答案 1 :(得分:2)
用一些平滑因子绘制概率密度(思考直方图)然后找到峰值(簇的中心)和波谷(簇之间的划分)
答案 2 :(得分:2)
这个问题有很多很好的方法,你最终应该使用的方法将取决于你正在处理的数据类型(即,它是如何分布的,数据点的维数,可能是重叠的簇,对异常值的鲁棒性等。)。
正如所说,首先要尝试的是k-means聚类。您可能还想看看一个名为k-medoids的简单变体(a.k.a.Partitioning Around Medoids(PAM)),它对异常值比k-means更强大。
关于k-means和k-medoids的一点需要注意的是参数 k (簇的数量)的存在。如果您不知道先验的聚类数量,有多种技术可以自动选择 k (交叉验证,剪影得分等);有关 R 中的更全面的群集分析实施列表,请参阅Cluster Analysis and Finite Mixture Models。
我个人最喜欢的聚类技术是高斯混合模型(GMM)。我通常通过名为MCLUST的 R 包使用GMM的良好实现,该包使用Bayesian Information Criterion自动识别群集的数量。
一旦选择了一种识别集群成员资格的方法(即哪些数据点被组合成集合),您就可以对它们进行平均处理或对数据进行平均处理。
答案 3 :(得分:0)
喜欢那个?
public class Cluster {
public static void main(String[] args) {
int maxDist = 5;
char cluster = 'A';
int[] values = { 5 , 7 , 7 , 8 , 8 , 8 , 7 , 20 , 23 , 23 , 24 , 24 , 24 , 25 };
int prev = values[0];
System.out.print( cluster + " - " + prev + " ");
for ( int i = 1 ; i < values.length ; i++ ) {
if ( Math.abs( prev - values[i] ) >= maxDist ) {
System.out.print( "\n" + ++cluster + " - " );
}
System.out.print( values[i] + " " );
prev = values[i];
}
}
}
编辑: 如果聚类不太接近,这种方法将起作用,就像您的值示例一样。 k-means需要一个已知的k(簇数),你的问题没有提到。分离群集后,您可以轻松找到“中心”作为平均值。