前几天突然在网上看到关于k-means算法的一个实现,不过写错,当我想回答时,贴子以关闭,现在我就在此把正确的贴出来,有错的还请指教:
package com.lele;
import java.util.ArrayList;
import java.util.List;
public class Kmeans {
private static int K = 5; // 类数(簇) 此程序为2
private static int TOTAL = 20; // 点个数 此程序为20
private int test = 0;
private Point[] unknown = new Point[TOTAL]; // 点数组
private int[] type = new int[TOTAL]; // 每个点暂时的类(簇)
private Point[] z = new Point[K];// 保存新的聚类中心
private Point[] z0 = new Point[K]; // 保存上一次的聚类中心
private Point sum=null;
private double[] Distance=new double[TOTAL];
private int temp = 0;
private int I = 0; // 迭代次数
/** Creates a new instance of Kmeans */
public Kmeans() {
/** 进行聚类运算的20个点 */
unknown[0] = new Point(5,5);
unknown[1] = new Point(7,9);
unknown[2] = new Point(0,1);
unknown[3] = new Point(1,1);
unknown[4] = new Point(2,1);
unknown[5] = new Point(1,2);
unknown[6] = new Point(2,2);
unknown[7] = new Point(3,2);
unknown[8] = new Point(6,6);
unknown[9] = new Point(7,6);
unknown[10] = new Point(8,6);
unknown[11] = new Point(6,7);
unknown[12] = new Point(7,7);
unknown[13] = new Point(8,7);
unknown[14] = new Point(9,7);
unknown[15] = new Point(7,8);
unknown[16] = new Point(8,8);
unknown[17] = new Point(9,8);
unknown[18] = new Point(8,9);
unknown[19] = new Point(9,9);
for(int i = 0;i < TOTAL; i++){
type[i] = 0;
}
for(int i = 0; i < K; i++){
z[i] = unknown[i]; // 伪随机选取
z0[i] = new Point(0.0,0.0);
}
}
/** 计算新的聚类中心 */
public Point newCenter(int m){
int n = 0;
sum=new Point(0,0);
for(int i = 0;i < TOTAL; i++){
if(type[i] == m){
sum.setX(sum.getX() + unknown[i].getX());
sum.setY(sum.getY() + unknown[i].getY());
n += 1;
}
}
sum.setX(sum.getX() / n);
sum.setY(sum.getY() / n);
System.out.println("第"+m+"类有"+n+"个");
return sum;
}
/** 比较两个聚类中心是否相等 */
public boolean isEqual(Point p1,Point p2){
System.out.println(p1.getX()+"**********"+p2.getX());
System.out.println(p1.getY()+"**********"+p2.getY());
if(Double.doubleToLongBits(p1.getX()) == Double.doubleToLongBits(p2.getX()) &&
Double.doubleToLongBits( p1.getY()) == Double.doubleToLongBits(p2.getY()))
return true;
else
return false;
}
/** 计算两点之间的欧式距离 */
public static double distance(Point p1,Point p2){
return (p1.getX() - p2.getX()) * (p1.getX() - p2.getX()) +
(p1.getY() - p2.getY()) * (p1.getY() - p2.getY());
}
/** 进行迭代,对TOTAL个样本根据聚类中心进行分类 */
public void order(){
int temp=0;
for(int i = 0; i < TOTAL;i++){
for(int j = 0; j < K;j++)
if(distance(unknown[i],z[temp])>distance(unknown[i],z[j]))
temp=j;
type[i]=temp;
System.out.println(unknown[i].toString()+"被归为"+temp);
}
}
public void main(){
System.out.println("共有如下个未知样本:");
for(int i = 0; i < TOTAL;i++){
System.out.println(unknown[i]);
//System.out.println("初始时,第" + i + "类中心:" + z[i].toString());
}
for(int i = 0; i < K;i++)
System.out.println("初始时,第" + i + "类中心:" + z[i].toString());
while(test < K){
System.out.println("current test:"+test);
order();
for(int i = 0; i < K;i ++){
z[i] = newCenter(i);
System.out.println("第" + i + " 类新中心:" + z[i].toString());
if(isEqual(z[i],z0[i]))
test += 1;
else
z0[i] = z[i];
}
I += 1;
System.out.println("已完成第" + I + "次迭代");
System.out.println("分类后有:");
for(int j = 0;j < K;j++){
System.out.println("第" + j + "类分类有: ");
for(int i = 0;i < TOTAL;i++){
if(type[i] == j)
System.out.println(unknown[i].toString());
}
}
}
}
/**
*
* @param args
*/
public static void main(String[] args){
new Kmeans().main();
}
}
package com.lele;
/**
*
* @author zhaole609
* define a point class
*
*/
public class Point {
private double x = 0;
private double y = 0;
/** Creates a new instance of Point */
public Point(double x,double y) {
this.setX(x);
this.setY(y);
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public String toString(){
return "[" + x + "," + y + "]";
}
/**
public static void main(String[] args) {
System.out.println(new Point(3,4).toString());
}*/
}
代码基本上和原来的一样,只是中间稍微变了一下。
分享到:
相关推荐
Matlab作为一个强大的数学计算和数据分析工具,提供了实现K-Means算法的便捷接口。 K-Means算法的基本步骤如下: 1. 初始化:选择K个初始质心(cluster centers),通常是随机从数据集中选取K个样本点作为初始的簇...
**K-means算法详解** K-means是一种广泛应用的无监督学习方法,主要用于数据的聚类分析。它通过迭代过程将数据点分配到预定义数量(K)的类别中,目标是使得同一类别内的数据点相互接近,不同类别之间的数据点尽...
Java作为一种通用且广泛使用的编程语言,提供了实现K-Means算法的良好平台,尤其适合初学者学习数据挖掘技术。 K-Means算法的核心步骤包括初始化中心点、计算样本到中心点的距离、重新分配样本点所属类别以及更新...
Python作为一门强大的编程语言,因其简洁的语法和丰富的科学计算库,成为实现K-Means算法的理想选择。 在Python中,我们通常使用`scikit-learn`库来实现K-Means算法。`scikit-learn`是Python中最重要的机器学习库之...
在这个“K-means.rar”压缩包中,包含的是一个使用MATLAB实现的K-means算法示例,对于初学者来说,这是一个很好的学习起点。 MATLAB是一种强大的编程环境,特别适合进行数值计算和数据分析。在MATLAB中实现K-means...
在K-Means算法中,选择合适的K值是一个关键问题。常见的方法有肘部法则和轮廓系数,前者是观察随着K增加,簇内平方和(SSE)的下降速率,选择“肘部”对应的K值;后者是评估簇的质量,选择轮廓系数最大的K值。 **...
文件"www.pudn.com.txt"可能是数据集的介绍或来源说明,而"breastcancer.txt"则很可能是一个实际的数据集,用于测试和展示改进后的K-means算法。乳腺癌数据集常常被用作机器学习的基准,其包含了多种特征,如肿瘤的...
通过以上分析,我们可以看出K-means算法虽然原理简单,但在实际应用中却十分灵活且强大,能够处理大量多维数据的聚类问题。同时,MATLAB作为一种高效的数据分析工具,提供了丰富的功能和库支持,使得K-means算法的...
在提供的`K_means.m`文件中,很可能是实现了K-means算法的一个MATLAB版本。MATLAB作为一种强大的数值计算语言,非常适合处理这种数据密集型任务。通常,MATLAB的K-means实现会包括以下部分: - 输入参数:数据矩阵...
在提供的文件列表中,`kmeans.cpp`可能是一个C++实现的k-means算法,它会包含算法的主要逻辑,如上述步骤的代码实现。`iris.data`则可能是鸢尾花数据集,这是一个经典的多维数据集,常用于测试各种机器学习算法,...
k-means算法作为一种划分方法,其优点包括算法简单、快速且易于实现;缺点则是需要提前指定簇的数目,且对噪声和离群点敏感,易受初始聚类中心选择的影响导致收敛到局部最优解。针对这些问题,研究者提出通过多次...
ISODATA算法是一种迭代的自我组织数据分析技术,它结合了K-means算法和聚类树(dendrogram)的概念。ISODATA首先假设一个初始的聚类数,然后通过迭代过程不断调整聚类中心和类别归属,直至满足停止条件,如达到预设...
首先,K-Means算法的基本思想是将数据集划分为K个不同的类别,每个类别由一个中心点(或称为质心)代表。在图像分割中,图像的像素被视为数据点,通过K-Means算法,我们可以将像素按照颜色或亮度等特征分组,形成...
K-Means算法是聚类分析中最常见和实用的方法之一,其核心思想是通过迭代优化来寻找最佳的聚类中心。本实验报告将深入探讨K-Means算法的实现细节,并结合实际案例进行分析。 K-Means算法的流程主要包括以下几个步骤...
K-means算法的优点在于简单快速,对于大数据集处理效率较高。然而,它也有一些局限性,比如对初始中心点的选择敏感,可能会陷入局部最优解,且不能处理非凸形状的簇。此外,K值的选择对结果影响很大,需要通过尝试...
在Java中实现K-means算法,我们可以遵循以下步骤: 1. **初始化**:首先,我们需要选择K个初始质心(centroid)。通常,这些质心可以从数据集中随机选取或者基于某种策略(如K-means++)来确定。 2. **分配样本**...