`
yuaqian2003
  • 浏览: 13729 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

K-means聚类

阅读更多
K-means聚类算法的一般步骤:

    * 初始化。输入基因表达矩阵作为对象集X,输入指定聚类类数N,并在X中随机选取N个对象作为初始聚类中心。设定迭代中止条件,比如最大循环次数或者聚类中心收敛误差容限。
    * 进行迭代。根据相似度准则将数据对象分配到最接近的聚类中心,从而形成一类。初始化隶属度矩阵。
    * 更新聚类中心。然后以每一类的平均向量作为新的聚类中心,重新分配数据对象。
    * 反复执行第二步和第三步直至满足中止条件。
具体实现代码如下:
public class BasicKMeans implements Serializable{

/**
*
*/
private static final long serialVersionUID = 1L;

private int numClusters=2;//想要聚类的个数

private int coordCount;//数据的个数

private double[][] datas;//原始数据

private KCluster[] _clusters;//聚类

/*
     * 定义一个变量用于记录和跟踪每个资料点属于哪个群聚类
     *_clusterAssignments[j]=i;// 表示第 j 个资料点对象属于第 i 个群聚类
     */
     final int[] _clusterAssignments;
    
     // 定义一个变量用于记录和跟踪每个资料点离聚类最近
     private final int[] _nearestCluster;
    
     /*定义一个变量,来表示资料点到中心点的距离,
      *其中_distanceCache[i][j]表示第i个资料点到第j个群聚对象中心点的距离;
      */
     private final double[][] _distanceCache;
    
     private static final Random _rnd = new Random(1);
    
     public BasicKMeans(double[][]datas,int num){
    this.datas=datas;
    this.numClusters=num;
    this.coordCount=datas.length;
    this._clusters=new KCluster[num];
    _clusterAssignments=new int[coordCount];
    _nearestCluster=new int[coordCount];
    _distanceCache=new double[coordCount][numClusters];
    InitRandom();
     }
    
     //
     public void start(){
    while(true){
    //1、重新计算每个聚类的均值
    for(int i=0;i<numClusters;i++){
    _clusters[i].updateCenter(datas);
    }
    //2 计算每个数据与聚类中心的距离
    for(int i=0;i<coordCount;i++){
    for(int j=0;j<numClusters;j++){
    double dist=getDistance(datas[i],_clusters[j].center);
    _distanceCache[i][j]=dist;
    }
    }
    //3、计算每个数据离哪个聚类最近
     //4、比较每个数据最近的聚类是否就是它所属的聚类
     //如果全相等表示所有的点已经是最佳距离了,直接返回;
    int k=0;
    for(int i=0;i<coordCount;i++){
    _nearestCluster[i]=nearestCluster(i);
    if(_clusterAssignments[i]==_nearestCluster[i])
    k++;
    }
    if(k==coordCount)
    break;
    //5、否则需要重新调整资料点和群聚类的关系,调整完毕后再重新开始循环;
             //需要修改每个聚类的成员和表示某个数据属于哪个聚类的变量
    for(int i=0;i<numClusters;i++){
    _clusters[i].currentMembership.clear();
    }
    for(int i=0;i<coordCount;i++){
    _clusters[_nearestCluster[i]].currentMembership.add(i);
    _clusterAssignments[i]=_nearestCluster[i];
    }
    }
     }
    
   //计算某个资料点最近的聚类
     public int nearestCluster(int index){
    int indexCluster=-1;
    double min=Double.MAX_VALUE;
    for(int i=0;i<numClusters;i++){
    double dis=_distanceCache[index][i];
    if(dis<min){
    min=dis;
    indexCluster=i;
    }
    }
    if(indexCluster==-1)
    ;
    return indexCluster;
     }
   //计算某数据离某聚类中心的距离时
     public double getDistance(double[] data,double[] center){
    //1 采用距离的算法计算
    int len=data.length;
    double sum=0;
    for(int i=0;i<len;i++){
    double v=data[i]-center[i];
    sum+=v*v;
    }
    return Math.sqrt(sum);
   
    }
    
  // 随机初始化k个聚类
     private void InitRandom(){
         for (int i = 0; i < numClusters; i++)
         {
             int temp = _rnd.nextInt(coordCount);
             _clusterAssignments[temp] = i; // 记录第temp个资料属于第i个聚类
             _clusters[i] = new KCluster(temp,datas[temp]);
         }
     }


public class KCluster {

public List<Integer> currentMembership = new ArrayList<Integer>();// 用于表示每个群聚包含的数据资料点集合
double[] center;// 用于表示每个聚类对象的均值,也就是中心对象

public KCluster(int dataIndex,double[] data){
currentMembership.add(dataIndex);
this.center=data;
}
// 根据 mCurrentMembership 取得原始资料点对象 coord ,该对象是 coordinates 的一个子集;
    //然后取出该子集的均值;取均值的算法很简单,可以把 coordinates 想象成一个 m*n 的距阵 ,
    //每个均值就是每个纵向列的取和平均值 , //该值保存在 mCenter 中
public void updateCenter(double[][] coordinates){
for(int i=0;i<currentMembership.size();i++){
double[] coord=coordinates[currentMembership.get(i)];
for(int j=0;j<coord.length;j++)
center[j]+=coord[j];// 得到每个纵向列的和;
}
for(int k=0;k<center.length;k++)
center[k]/=currentMembership.size();// 对每个纵向列取平均值
}

}
分享到:
评论

相关推荐

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

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

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

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

    基于改进的K-means聚类的多区域物流中心选址算法

    针对当前多区域物流中心选址需建立配送中心个数不定、位置、覆盖范围不明的问题,本文提出了一种改进的k-means聚类算法,以城市经济引力模型为基础,将城市运输距离与居民消费能力的指标相结合,重新定义对象之间...

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

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

    基于k-means聚类方法和DTW算法结合起来分析时间序列类型的用户用电数据源码+项目说明.zip

    传统K-means聚类方法使用欧氏距离进行分类的依据,无法处理长短不一的时间序列数据。基于DTW距离的时间序列聚类算法,与传统的k-means算法相比,能够处理非线性对齐的时间序列,因此适用于更广泛的应用领域。 实验 ...

    k-means聚类分析

    k-means聚类是一种广泛应用的数据挖掘技术,常用于无监督学习场景,旨在将数据集划分为K个不同的簇,使得每个簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。这种算法基于距离度量,如欧几里得距离,以...

    k-means聚类 动画演示

    k-means聚类是一种广泛应用的数据挖掘技术,主要目的是将数据集划分为K个互不重叠的类别,每个类别内部的数据点尽可能相似,而类别之间的差异性则尽可能大。这个过程是通过迭代来实现的,直到满足某种停止条件,如...

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

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

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

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

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

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

    基于特征选择的K-means聚类异常检测方法

    但是,传统的K-means聚类算法在选取初始中心和度量相似性上有一定缺陷。针对传统的K-means算法中存在的问题,本文对原有的方法进行了改进。第一,在初始化聚类中心时选取了一种优化的方法作为初始聚类中心,替代原有的...

    国信证券_20161205_金融工程专题研究:基于k-means聚类的多因子特征检验.pdf

    ### 金融工程专题研究:基于k-means聚类的多因子特征检验 #### K-Means聚类在金融工程中的应用 本研究报告由国信证券发布于2016年12月5日,旨在探讨如何利用k-means聚类算法进行多因子特征检验,并进一步构建有效...

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

    K-means聚类是一种常见的无监督学习方法,用于将数据集划分为K个互不重叠的类别,每个类别由其内部数据点的均值代表。在这个特定的应用中,它被用来对图像进行区域分割,即将图像分割成不同的部分,每个部分具有相似...

    基于改进K-means聚类计及分布式光伏和电动汽车的园区负荷聚合体的最优构建.pdf

    "基于改进K-means聚类计及分布式光伏和电动汽车的园区负荷聚合体的最优构建" 本文主要介绍了基于改进K-means聚类算法和分布式光伏和电动汽车的园区负荷聚合体的最优构建。该方法通过将K-means聚类算法与万有引力...

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

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

    实验3-K-means聚类实验_python_

    在本实验中,我们将深入探讨K-means聚类算法,这是一种广泛应用的数据挖掘技术,用于无监督学习中的数据分组。K-means算法基于距离度量,通过迭代过程将数据点分配到最近的聚类中心,直到聚类中心不再显著变化或达到...

    K-means聚类算法.pptx

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

    K-MEANS聚类算法的实现

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

    基于Excel的二维数组k-means聚类

    在数据分析和挖掘领域,k-means聚类是一种广泛应用的无监督学习方法,它通过寻找数据集中的潜在结构,将相似的数据归为一类。本篇主要介绍如何借助Excel的VBA(Visual Basic for Applications)语法来实现二维数组的...

Global site tag (gtag.js) - Google Analytics