如何找到数字簇的中心?统计问题?

时间:2010-01-08 11:34:18

标签: math statistics

我有一个问题,我有一组数字,例如。

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个“吸引子/簇”。

4 个答案:

答案 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(簇数),你的问题没有提到。分离群集后,您可以轻松找到“中心”作为平均值。