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();// 对每个纵向列取平均值
}
}
分享到:
相关推荐
基于K-means聚类算法的图像分割 算法的基本原理: 基于K-means聚类算法的图像分割以图像中的像素为数据点,按照指定的簇数进行聚类,然后将每个像素点以其对应的聚类中心替代,重构该图像。 算法步骤: ①随机选取...
基于 K-means 聚类算法的图像区域分割,首先从数据样本种选取K个点作为初始聚类中心,其次计算各个样本到聚类的距离,把样本归到离它最近的那个聚类中心所在的累,计算新形成的每个聚类的数据对象的平均值来得到新的...
但是,传统的K-means聚类算法在选取初始中心和度量相似性上有一定缺陷。针对传统的K-means算法中存在的问题,本文对原有的方法进行了改进。第一,在初始化聚类中心时选取了一种优化的方法作为初始聚类中心,替代原有的...
针对当前多区域物流中心选址需建立配送中心个数不定、位置、覆盖范围不明的问题,本文提出了一种改进的k-means聚类算法,以城市经济引力模型为基础,将城市运输距离与居民消费能力的指标相结合,重新定义对象之间...
主要介绍了详解Java实现的k-means聚类算法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
利用K-means聚类法将灰度图像划分成聚类分区, 在每个聚类分区应用最小平方法least-squares最小化二值半色调图像和原始灰度级图像之间的平方误差, 所构造的半色调算法与基于模型的最小平方法LSMB算法相比, 随着聚类...
基于k-means聚类算法的研究,黄韬,刘胜辉,本文首先分析研究聚类分析方法,对多种聚类分析算法进行分析比较,讨论各自的优点和不足,同时针对原k-means算法的聚类结果受随机��
主要介绍了Python用K-means聚类算法进行客户分群的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
用动画效果 帮助新手理解K-means聚类,有数据,有动画
实验五 K-Means聚类算法.ipynb
深大计软_最优化方法_实验1:K-Means聚类之Python实现手写数字图像MNIST分类
1.版本:matlab2019a,不会运行可私信 2.领域:【数据聚类】 3.内容:基于k-means聚类算法实现三维数据分类含Matlab源码 4.适合人群:本科,硕士等教研学习使用
将流形距离引入K-means聚类算法中,对于具有流形结构的数据集有很好的聚类效果,流形距离计算参数的设定充分考虑了全局和局部一致性。
(带注释)基于K-means聚类算法的图像区域分割.zip,MATLAB实现,详情可以参考:https://blog.csdn.net/didi_ya/article/details/115376184
采用K-means聚类,实现多维矩阵的聚类,并进行可视化展示(matlab).rar
基于K-means聚类算法的图像分割(MATLAB实现),如有需要,请下载!!
国信证券_20161205_金融工程专题研究:基于k-means聚类的多因子特征检验.pdf
上述代码是利用python内置的k-means聚类算法对鸢尾花数据的聚类效果展示,注意在运行该代码时需要采用pip或者其他方式为自己的python安装sklearn以及iris扩展包,其中X = iris.data[:]表示我们采用了鸢尾花数据的四...
K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求...