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聚类算法详解 k-means聚类算法是一种常用的无监督学习算法,用于对数据进行聚类分析。该算法的主要思想是将相似的数据点聚类到一起,形成不同的簇。Java语言是实现k-means聚类算法的不二之选。 ...
基于K-means聚类算法的图像分割 算法的基本原理: 基于K-means聚类算法的图像分割以图像中的像素为数据点,按照指定的簇数进行聚类,然后将每个像素点以其对应的聚类中心替代,重构该图像。 算法步骤: ①随机选取...
针对当前多区域物流中心选址需建立配送中心个数不定、位置、覆盖范围不明的问题,本文提出了一种改进的k-means聚类算法,以城市经济引力模型为基础,将城市运输距离与居民消费能力的指标相结合,重新定义对象之间...
《基于K-means聚类算法的图像分割在MATLAB中的实现》 图像分割是计算机视觉领域中的基础任务,它旨在将图像划分为多个区域或对象,每个区域具有相似的特征。K-means聚类算法是一种广泛应用的数据分析方法,它通过...
传统K-means聚类方法使用欧氏距离进行分类的依据,无法处理长短不一的时间序列数据。基于DTW距离的时间序列聚类算法,与传统的k-means算法相比,能够处理非线性对齐的时间序列,因此适用于更广泛的应用领域。 实验 ...
k-means聚类是一种广泛应用的数据挖掘技术,常用于无监督学习场景,旨在将数据集划分为K个不同的簇,使得每个簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。这种算法基于距离度量,如欧几里得距离,以...
k-means聚类是一种广泛应用的数据挖掘技术,主要目的是将数据集划分为K个互不重叠的类别,每个类别内部的数据点尽可能相似,而类别之间的差异性则尽可能大。这个过程是通过迭代来实现的,直到满足某种停止条件,如...
《K-means聚类算法在计算机视觉中的应用与MATLAB实现》 K-means聚类算法,作为一种简单而有效的无监督机器学习方法,被广泛应用于数据挖掘和图像处理领域,尤其是在计算机视觉中,它能够对图像进行自动分类,识别...
在本实验中,我们将深入探讨如何使用Python编程语言和K-Means聚类算法来对MNIST数据集中的手写数字图像进行分类。MNIST数据集是机器学习领域的一个经典基准,它包含了大量的0到9的手写数字图像,用于训练和测试图像...
基于 K-means 聚类算法的图像区域分割,首先从数据样本种选取K个点作为初始聚类中心,其次计算各个样本到聚类的距离,把样本归到离它最近的那个聚类中心所在的累,计算新形成的每个聚类的数据对象的平均值来得到新的...
但是,传统的K-means聚类算法在选取初始中心和度量相似性上有一定缺陷。针对传统的K-means算法中存在的问题,本文对原有的方法进行了改进。第一,在初始化聚类中心时选取了一种优化的方法作为初始聚类中心,替代原有的...
### 金融工程专题研究:基于k-means聚类的多因子特征检验 #### K-Means聚类在金融工程中的应用 本研究报告由国信证券发布于2016年12月5日,旨在探讨如何利用k-means聚类算法进行多因子特征检验,并进一步构建有效...
K-means聚类是一种常见的无监督学习方法,用于将数据集划分为K个互不重叠的类别,每个类别由其内部数据点的均值代表。在这个特定的应用中,它被用来对图像进行区域分割,即将图像分割成不同的部分,每个部分具有相似...
"基于改进K-means聚类计及分布式光伏和电动汽车的园区负荷聚合体的最优构建" 本文主要介绍了基于改进K-means聚类算法和分布式光伏和电动汽车的园区负荷聚合体的最优构建。该方法通过将K-means聚类算法与万有引力...
k-means聚类算法是其中最简单且广泛使用的算法之一,尤其适用于处理大规模数据集。本篇文章将深入探讨如何在Matlab环境下实现k-means算法对三维数据进行分类,并结合提供的源代码进行解析。 首先,k-means算法的...
在本实验中,我们将深入探讨K-means聚类算法,这是一种广泛应用的数据挖掘技术,用于无监督学习中的数据分组。K-means算法基于距离度量,通过迭代过程将数据点分配到最近的聚类中心,直到聚类中心不再显著变化或达到...
K-means聚类算法是一种广泛应用的无监督学习方法,主要用于数据的分组或分类,尤其在数据挖掘和机器学习领域。它的目标是将数据集划分为k个互不重叠的簇,使得同一簇内的数据点间的相似度尽可能高,而不同簇之间的...
K-MEANS聚类算法的实现 K-MEANS聚类算法是一种常用的无监督机器学习算法,主要用于对数据进行聚类分析。该算法的主要思想是将相似的数据对象划分到同一个簇中,使得簇内的数据对象尽量相似,而簇间的数据对象尽量...
在数据分析和挖掘领域,k-means聚类是一种广泛应用的无监督学习方法,它通过寻找数据集中的潜在结构,将相似的数据归为一类。本篇主要介绍如何借助Excel的VBA(Visual Basic for Applications)语法来实现二维数组的...