`

K-MEANS聚类算法

阅读更多

K-MEANS 算法

    输入聚类个数 k ,以及包含 n 个数据对象的数据库,输出满足方差最小标准的 k 个聚类。

    k-means 算法接受输入量 k ;然后将 n 个数据对象划分为 k 个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个 中心对象 (引力中心)来进行计算的。

    k-means 算法的工作过程说明如下:首先从 n 个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。一般都采用均方差作为标准测度函数 k 个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。

处理流程

  ( 1 n 个数据对象任意选择 k 个对象作为初始聚类中心;

  ( 2 循环( 3 )到( 4 )直到每个聚类不再发生变化为止

  ( 3 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;并根据最小距离重新对相应对象进行划分;

  ( 4 重新计算每个(有变化)聚类的均值(中心对象)

 

计算复杂度:

O(nkt), 其中 t 是迭代次数。



下面是程序代码:

效果是分成了1,2,3,5,6,7,9,10,11 和 100,150,200 和 1000三组,和感觉上的聚类一样:)

 

public class BasicKMeans {

    public static void main(String[] args) {

        double [] p={1,2,3,5,6,7,9,10,11,100,150,200,1000};

        int k=3;

        double [][] g;

        g=cluster (p,k);

        for ( int i=0;i<g. length ;i++){

            for ( int j=0;j<g[i]. length ;j++){

                System. out .print(g[i][j]+ "\t" );

            }

            System. out .println();

        }

    }

   

    /**

      * 聚类函数

      * @param p 数据对象

      * @param k 聚类数目

      * @return

      */

    public static double [][] cluster( double [] p, int k){

        double [] c= new double [k];   // 旧的聚类中心

        double [] nc= new double [k];  // 新的聚类中心

        double [][] g;               // 结果

       

        /*

          * 1. 初始化聚类中心(经典方式是随机选取 k 个,本例中取前 k 个)

          */

        for ( int i=0;i<k;i++){

            c[i]=p[i];

        }

       

        /*

          * 2. 循环聚类,更新聚类中心直到不变为止

          */

        while ( true ){

            /*

              * 2.1 根据数组中每个元素分配给当前聚类中心

              */

            g=group (p,c);

            /*

              * 2.2 计算分配后的聚类中心

              */

            for ( int i=0;i<g. length ;i++){

                nc[i]=center (g[i]);

            }

           

            /*

              * 2.3 更新聚类中心

              */

            if (!equal (nc,c)){

                c=nc;

                nc= new double [k];

            } else {

                break ;

            }

        } //while(true)

       

        return g;

    }

   

    /**

      * 根据聚类中心 c 将数组 p 中元素分配到不同类别 !!!

      * @param p 待分配的数组

      * @param c 聚类中心数组

      * @return

      */

    private static double [][] group( double [] p, double [] c) {

        int [] gi= new int [p. length ]; // 记录每个元素被归到哪一类

       

        /*

          * 考察每个元素 pi 同每个聚类中心 cj 的距离,

          * 距离最小就将 pi 归为 j 类

          */

        for ( int i=0;i<p. length ;i++){

            double [] d= new double [c. length ];

            for ( int j=0;j<c. length ;j++){

                d[j]=distance (p[i],c[j]);

            }

            int minDistOffset=min (d);

            gi[i]=minDistOffset;

        }

       

        double [][] g= new double [c. length ][]; // 存放分组结果

       

        /*

          * 根据上面找到的结果,设置好返回值

          */

        for ( int i=0;i<c. length ;i++){

            int s=0; // 某类的大小

            for ( int j=0;j<gi. length ;j++){

                if (gi[j]==i) s++;

            }

            g[i]= new double [s];

            s=0;

            for ( int j=0;j<gi. length ;j++){

                if (gi[j]==i){

                    g[i][s]=p[j];

                    s++;

                }

            }

        }

       

        return g;

    }

 

    /**

      * 重新计算一个类的中心(简单的以为聚类返回其算术平均值)

      * @param gi

      * @return

      */

    private static double center( double [] gi) {

        return sum (gi)/gi. length ;

    }

   

    /**

      * 返回两点的一维欧氏距离

      */

    private static double distance( double x, double y){

        return Math.abs (x-y);

    }

   

    /**

      * 返回数组和

      */

    private static double sum( double [] arr) {

        double sum=0.0;

        for ( int i=0;i<arr. length ;i++){

            sum+=arr[i];

        }

        return sum;

    }

   

    /**

      * 返回数组(第一个)最小元素下标

      */

    private static int min( double [] arr){

        int min=0;

        double minEle=arr[0];

        for ( int i=1;i<arr. length ;i++){

            if (arr[i]<minEle){

                min=i;

                minEle=arr[i];

            }

        }

        return min;

    }

   

    /**

      * 判断两个数组是否相同

      */

    private static boolean equal( double [] a, double [] b){

        if (a. length !=b. length ){

            return false ;

        } else {

            for ( int i=0;i<a. length ;i++){

                if (a[i]!=b[i]) return false ;

            }

        }

        return true ;

    }

} 
分享到:
评论

相关推荐

    详解Java实现的k-means聚类算法

    Java实现的k-means聚类算法详解 k-means聚类算法是一种常用的无监督学习算法,用于对数据进行聚类分析。该算法的主要思想是将相似的数据点聚类到一起,形成不同的簇。Java语言是实现k-means聚类算法的不二之选。 ...

    基于K-means聚类算法的图像分割及其MATLAB实现

    基于K-means聚类算法的图像分割 算法的基本原理:  基于K-means聚类算法的图像分割以图像中的像素为数据点,按照指定的簇数进行聚类,然后将每个像素点以其对应的聚类中心替代,重构该图像。 算法步骤: ①随机选取...

    基于K-means聚类算法的图像分割(MATLAB实现).rar_ASV聚类_K-Means图像分割_k means_rest

    《基于K-means聚类算法的图像分割在MATLAB中的实现》 图像分割是计算机视觉领域中的基础任务,它旨在将图像划分为多个区域或对象,每个区域具有相似的特征。K-means聚类算法是一种广泛应用的数据分析方法,它通过...

    基于 K-means 聚类算法的图像区域分割.zip

    基于 K-means 聚类算法的图像区域分割,首先从数据样本种选取K个点作为初始聚类中心,其次计算各个样本到聚类的距离,把样本归到离它最近的那个聚类中心所在的累,计算新形成的每个聚类的数据对象的平均值来得到新的...

    基于k-means聚类算法实现三维数据分类含Matlab源码

    k-means聚类算法是其中最简单且广泛使用的算法之一,尤其适用于处理大规模数据集。本篇文章将深入探讨如何在Matlab环境下实现k-means算法对三维数据进行分类,并结合提供的源代码进行解析。 首先,k-means算法的...

    基于 K-means 聚类算法的图像区域分割

    标题“基于 K-means 聚类算法的图像区域分割”揭示了这是一个关于利用K-means算法处理图像处理问题的项目。K-means聚类是一种常见的无监督学习方法,用于将数据集划分为K个互不重叠的类别,每个类别由其内部数据点的...

    K-means聚类算法.pptx

    K-means聚类算法是一种广泛应用的无监督学习方法,主要用于数据的分组或分类,尤其在数据挖掘和机器学习领域。它的目标是将数据集划分为k个互不重叠的簇,使得同一簇内的数据点间的相似度尽可能高,而不同簇之间的...

    论文研究-基于k-means聚类算法的研究 .pdf

    基于k-means聚类算法的研究涉及了数据挖掘领域中的关键算法,该研究由黄韬、刘胜辉、谭艳娜三位研究人员共同完成,其研究机构分别为哈尔滨理工大学计算机科学与技术学院、软件学院和哈尔滨工程大学计算机科学与技术...

    K-MEANS聚类算法的实现

    K-MEANS聚类算法的实现 K-MEANS聚类算法是一种常用的无监督机器学习算法,主要用于对数据进行聚类分析。该算法的主要思想是将相似的数据对象划分到同一个簇中,使得簇内的数据对象尽量相似,而簇间的数据对象尽量...

    k-means聚类学习算法matlab源码

    《K-means聚类算法在计算机视觉中的应用与MATLAB实现》 K-means聚类算法,作为一种简单而有效的无监督机器学习方法,被广泛应用于数据挖掘和图像处理领域,尤其是在计算机视觉中,它能够对图像进行自动分类,识别...

    一种分布式的K-means聚类算法.pdf

    分布式K-means聚类算法是大数据分析中处理大规模数据集的一个重要工具。随着数据量的日益增长,传统的集中式K-means算法在面对海量数据时,由于计算资源和内存限制,常常效率低下,甚至无法有效执行。为了解决这一...

    K-Means聚类算法研究综述_杨俊闯.pdf

    K-Means聚类算法是一种在数据挖掘和机器学习领域广泛应用的无监督学习算法,其核心思想是根据数据对象之间的相似度将它们划分为若干个簇。K-Means算法的主要优点是原理简单、效果显著、实现方便,使得它成为许多应用...

    K-Means聚类算法C#实现

    K-Means聚类算法是一种广泛应用的无监督学习方法,主要用于数据的分组或分类。在C#中实现K-Means,可以帮助开发者在各种数据分析和机器学习项目中进行数据处理。以下是关于K-Means聚类算法及其C#实现的关键知识点: ...

    基于K-Means聚类算法的HDMA数据挖掘方法.pdf

    根据提供的文件信息,本文主要讨论了在数据挖掘领域中,尤其是在高维混合属性数据挖掘中运用K-Means聚类算法的方法。该方法旨在通过提高聚类分析的质量,来增强对高维数据的挖掘效果。以下是对该文档中提到的知识点...

    深大计软_最优化方法_实验1:K-Means聚类之Python实现手写数字图像MNIST分类

    在本实验中,我们将深入探讨如何使用Python编程语言和K-Means聚类算法来对MNIST数据集中的手写数字图像进行分类。MNIST数据集是机器学习领域的一个经典基准,它包含了大量的0到9的手写数字图像,用于训练和测试图像...

    基于K-means聚类算法的住院费用数据挖掘.pdf

    为了解决这一问题,本文提出了利用K-means聚类算法对住院费用数据进行挖掘的方法。本文的研究与开发涵盖了数据预处理、数据分析等多个方面,详细介绍了使用该算法的流程和实际应用。 首先,文章提出了K-means聚类...

    孤立点分析在审计疑点发现中的应用探讨——基于K-Means聚类算法的Python实现.pdf

    K-Means聚类算法是数据分析中常用的一种无监督学习算法,该算法通过迭代的方式将数据划分为K个聚类,并确保同一个聚类内的数据点相似度较高,不同聚类之间的数据点相似度较低。在审计疑点发现中,K-Means算法可以...

Global site tag (gtag.js) - Google Analytics