算法描述

(1)任意选择k个数据对象作为初始聚类中心
(2)根据簇中对象的平均值,将每个对象赋给最类似的簇
(3)更新簇的平均值,即计算每个对象簇中对象的平均值
(4)计算聚类准则函数E
(5)重复2-4步骤,直到准则函数E值不再进行变化

代码


public class Cluster {public String clusterName; // 类簇名private Medoid medoid; // 类簇的质点private ArrayList<DataPoint> dataPoints; // 类簇中各样本点public Cluster(String clusterName) {this.clusterName = clusterName;this.medoid = null; // will be set by calling setCentroid()dataPoints = new ArrayList<DataPoint>();}public void setMedoid(Medoid c) {medoid = c;}public Medoid getMedoid() {return medoid;}public void addDataPoint(DataPoint dp) { // called from CAInstancedp.setCluster(this);// 标注该类簇属于某点,计算欧式距离this.dataPoints.add(dp);}public void removeDataPoint(DataPoint dp) {this.dataPoints.remove(dp);}public int getNumDataPoints() {return this.dataPoints.size();}public DataPoint getDataPoint(int pos) {return (DataPoint) this.dataPoints.get(pos);}public String getName() {return this.clusterName;}public ArrayList<DataPoint> getDataPoints() {return this.dataPoints;}
}

public class ClusterAnalysis {public Cluster[] clusters;// 所有类簇private int miter;// 迭代次数private ArrayList<DataPoint> dataPoints = new ArrayList<DataPoint>();// 所有样本点private int dimNum;//维度public ClusterAnalysis(int k, int iter, ArrayList<DataPoint> dataPoints,int dimNum) {clusters = new Cluster[k];// 类簇种类数for (int i = 0; i < k; i++) {clusters[i] = new Cluster(i+"");}this.miter = iter;this.dataPoints = dataPoints;this.dimNum=dimNum;}public int getIterations() {return miter;}public ArrayList<DataPoint>[] getClusterOutput() {ArrayList<DataPoint> v[] = new ArrayList[clusters.length];for (int i = 0; i < clusters.length; i++) {v[i] = clusters[i].getDataPoints();}return v;}public void startAnalysis(double[][] medoids) {setInitialMedoids(medoids);double[][] newMedoids=medoids;double[][] oldMedoids=new double[medoids.length][this.dimNum];while(!isEqual(oldMedoids,newMedoids)){for(int m = 0; m < clusters.length; m++){//每次迭代开始情况各类簇的点clusters[m].getDataPoints().clear();}for (int j = 0; j < dataPoints.size(); j++) {int clusterIndex=0;double minDistance=Double.MAX_VALUE;for (int k = 0; k < clusters.length; k++) {//判断样本点属于哪个类簇double eucDistance=dataPoints.get(j).testEuclideanDistance(clusters[k].getMedoid());if(eucDistance<minDistance){minDistance=eucDistance;clusterIndex=k;}}//将该样本点添加到该类簇clusters[clusterIndex].addDataPoint(dataPoints.get(j));}for(int m = 0; m < clusters.length; m++){clusters[m].getMedoid().calcMedoid();//重新计算各类簇的质点}for(int i=0;i<medoids.length;i++){for(int j=0;j<this.dimNum;j++){oldMedoids[i][j]=newMedoids[i][j];}}for(int n=0;n<clusters.length;n++){newMedoids[n]=clusters[n].getMedoid().getDimensioin();}this.miter++;}}private void setInitialMedoids(double[][] medoids) {for (int n = 0; n < clusters.length; n++) {Medoid medoid = new Medoid(medoids[n]);clusters[n].setMedoid(medoid);medoid.setCluster(clusters[n]);}}private boolean isEqual(double[][] oldMedoids,double[][] newMedoids){boolean flag=false;for(int i=0;i<oldMedoids.length;i++){for(int j=0;j<oldMedoids[i].length;j++){if(oldMedoids[i][j]!=newMedoids[i][j]){return flag;}}}flag=true;return flag;}
}

public class DataPoint {private double dimension[]; //样本点的维度private String pointName; //样本点名字private Cluster cluster; //类簇private double euDt;//样本点到质点的距离public DataPoint(double dimension[], String pointName) {this.dimension = dimension;this.pointName = pointName;this.cluster = null;}@Overridepublic String toString() {String result = "Point_id=" + pointName + "  [";for (int i = 0; i < dimension.length; i++) {result += String.format("%.2f",dimension[i]) + " ";}return result.trim()+"] clusterId: "+cluster.clusterName;}public void setCluster(Cluster cluster) {this.cluster = cluster;}public double calEuclideanDistanceSum() {double sum=0.0;Cluster cluster=this.getCluster();ArrayList<DataPoint> dataPoints=cluster.getDataPoints();for(int i=0;i<dataPoints.size();i++){double[] dims=dataPoints.get(i).getDimensioin();for(int j=0;j<dims.length;j++){double temp=Math.pow((dims[j]-this.dimension[j]),2);sum=sum+temp;}}return Math.sqrt(sum);}public double testEuclideanDistance(Medoid c) {double sum=0.0;double[] cDim=c.getDimensioin();for(int i=0;i<dimension.length;i++){double temp=Math.pow((dimension[i]-cDim[i]),2);sum=sum+temp;}return Math.sqrt(sum);}public double[] getDimensioin() {return this.dimension;}public Cluster getCluster() {return this.cluster;}public double getCurrentEuDt() {return this.euDt;}public String getPointName() {return this.pointName;}
}
public class Medoid{private double dimension[]; // 质点的维度private Cluster cluster; //所属类簇private double etdDisSum;//Medoid到本类簇中所有的欧式距离之和public String toString() {String result ="  [";DecimalFormat decimalFormat=new DecimalFormat("0.000000");for (int i = 0; i < dimension.length; i++) {result += decimalFormat.format(dimension[i]) + " ";}return result.trim()+"] clusterId: "+cluster.clusterName;}public Medoid(double dimension[]) {this.dimension = dimension;}public void setCluster(Cluster c) {this.cluster = c;}public double[] getDimensioin() {return this.dimension;}public Cluster getCluster() {return this.cluster;}public void calcMedoid() {// 取代价最小的点calcEtdDisSum();double minEucDisSum = this.etdDisSum;ArrayList<DataPoint> dps = this.cluster.getDataPoints();for (int i = 0; i < dps.size(); i++) {double tempeucDisSum = dps.get(i).calEuclideanDistanceSum();if (tempeucDisSum < minEucDisSum) {dimension = dps.get(i).getDimensioin();minEucDisSum=tempeucDisSum;}}}// 计算该Medoid到同类簇所有样本点的欧斯距离和private void calcEtdDisSum() {double sum=0.0;Cluster cluster=this.getCluster();ArrayList<DataPoint> dataPoints=cluster.getDataPoints();for(int i=0;i<dataPoints.size();i++){double[] dims=dataPoints.get(i).getDimensioin();for(int j=0;j<dims.length;j++){double temp=Math.abs(dims[j]-this.dimension[j]);sum=sum+temp;}}etdDisSum= sum;}
}

public class TestMain {public static List<double[]> readTxt(String fileName){List<double[]> list=new ArrayList<>();try {File filename = new File(fileName); // 读取input.txt文件InputStreamReader reader = new InputStreamReader(new FileInputStream(filename)); // 建立一个输入流对象readerBufferedReader br = new BufferedReader(reader);String line = "";line = br.readLine();while (true) {line = br.readLine();if(line==null) break;String[] temp=line.split(",");double[] c=new double[temp.length];for(int i=0;i<temp.length;i++){c[i]=Float.parseFloat(temp[i]);}list.add(c);}} catch (Exception e) {e.printStackTrace();}return list;}public static void writeTxt(String content){try { // 防止文件建立或读取失败,用catch捕捉错误并打印,也可以throw/* 读入TXT文件 */File writename = new File("src/km/output.txt"); // 相对路径,如果没有则要建立一个新的output。txt文件BufferedWriter out = new BufferedWriter(new FileWriter(writename));out.write(content); // \r\n即为换行out.flush(); // 把缓存区内容压入文件out.close(); // 最后记得关闭文件} catch (Exception e) {e.printStackTrace();}}public static void main (String args[]){ArrayList<DataPoint> dataPoints = new ArrayList<DataPoint>();List<double[]> list=readTxt("src/km/t2.txt");for(int i=0;i<list.size();i++){dataPoints.add(new DataPoint(list.get(i),String.valueOf(i)));}long s=System.currentTimeMillis();ClusterAnalysis ca=new ClusterAnalysis(5,200,dataPoints,5);double[][] cen={list.get(22),list.get(3),list.get(45),list.get(156),list.get(96)};ca.startAnalysis(cen);StringBuilder stringBuilder=new StringBuilder();ArrayList<DataPoint>[] v = ca.getClusterOutput();System.out.println("K-中心点聚类算法运行时间"+(System.currentTimeMillis()-s)+"ms");for (int ii=0; ii<v.length; ii++){ArrayList tempV = v[ii];stringBuilder.append("\n").append("-----------Cluster").append(ii).append("---------").append("\n");stringBuilder.append("Mid_Point:  ").append(ca.clusters[ii].getMedoid()).append("  Points_num:  "+ca.clusters[ii].getDataPoints().size()).append("\n");System.out.println(ca.clusters[ii].getMedoid()+"  Points_num:  "+ca.clusters[ii].getDataPoints().size());Iterator iter = tempV.iterator();while(iter.hasNext()){DataPoint dpTemp = (DataPoint)iter.next();stringBuilder.append(dpTemp).append("\n");}}writeTxt(stringBuilder.toString());}}

数据挖掘—K-Means算法(Java实现)相关推荐

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

  3. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  4. 数据挖掘10大算法详细介绍

    想初步了解下怎样数据挖掘,看到一篇不错的文章转载过来啦~ 转自:http://blog.jobbole.com/89037/ 在一份调查问卷中,三个独立专家小组投票选出的十大最有影响力的数据挖掘算法, ...

  5. K means 图片压缩

    k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...

  6. java实现 k nn算法_数据挖掘(二)——Knn算法的java实现

    本文接数据挖掘-基于Kmeans算法.MBSAS算法及DBSCAN算法的newsgroup18828文本聚类器的JAVA实现(上). (update 2012.12.28 关于本项目下载及运行的常见问 ...

  7. 数据挖掘各种算法JAVA的实现方法

    数据挖掘-关联分析频繁模式挖掘Apriori.FP-Growth及Eclat算法的JAVA及C++实现: 网址:http://blog.csdn.net/yangliuy/article/detail ...

  8. Leetcode算法Java全解答--60. 第k个排列

    Leetcode算法Java全解答–60. 第k个排列 文章目录 Leetcode算法Java全解答--60. 第k个排列 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 ...

  9. 机器学习算法:18大数据挖掘的经典算法以及代码Java实现

    https://python.ctolib.com/article/wiki/95851 数据挖掘十大类经典算法 基于Java8实现. 算法目录 常用的标准数据挖掘算法 包名 目录名 算法名 Asso ...

  10. 数据挖掘--“聚类”详解、K-means、K-平均值算法、K均值算法

    一. 什么是聚类 二. 聚类步骤 三. 聚类算法有哪些 1 层次聚类算法 2 划分聚类算法 3 基于密度的聚类算法 4 基于网格的聚类算法 5 基于模型的聚类算法 一. 什么是聚类? 物以类聚,人以群 ...

最新文章

  1. 理解Android Java垃圾回收机制
  2. 《密码与安全新技术专题》第11周作业
  3. winform 鼠标 静止时间_赢得电竞的奥秘,你需要一块好鼠标垫
  4. 手机做服务器性能咋样,服务器性能不足 怎样才能逼出最强状态
  5. Linux下查看文件内容的ASCII码以检查内容的编码一致
  6. linux 安装 powershell
  7. web前端模块化开发_真正的模块化Web应用程序:为什么没有开发标准?
  8. SQL Server 数据库构架
  9. 软件发布的版本缩写含义RC 、RTM
  10. JavaScript模拟实现“实例成员”和“静态成员”
  11. 【bzoj2199/Usaco2011 Jan】奶牛议会——2-sat
  12. txtv28pw河南某中学_有一种寒冷叫不穿秋裤!河南一中学班主任让学生列队挨个检查秋裤...
  13. Alonzo Church的λ演算(摘自彭罗斯《皇帝新脑》)
  14. 37--8位级联加法器,并行加法器
  15. 【中级计量经济学】Lecture 1 计量经济学初步
  16. [lua]紫猫lua教程-命令宝典-L1-01-09. string字符串函数库
  17. 操作系统——进程管理(进程的概念与进程控制)
  18. python中eval函数的用法
  19. 关于内部文档的标准格式要求(图文)
  20. mysql:Row size too large (> 8126)

热门文章

  1. makefile的两个变量(自动变量和普通变量)
  2. iphone手机型号获取
  3. uva 524(Prime Ring Problem UVA - 524 )
  4. 感想3-对于业务逻辑复用、模板复用的一些思考(未完)
  5. Loadrunner常用15种的分析点
  6. 销售员/学员/讲师系统
  7. Lecture 13 Amortized Analysis
  8. CentOS 7 使用 ACL 设置文件权限
  9. Toast源码深度分析
  10. 【java并发编程艺术学习】(一)初衷、感想与笔记目录