K中心点算法(K-medoids) java实现
来源:互联网 发布:软件开发过程不包括 编辑:程序博客网 时间:2024/06/13 21:25
package com.kmedoids;import java.util.ArrayList;public class Cluster { private 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 CAInstance dp.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; }}------------------------------------package com.kmedoids;import java.util.ArrayList;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; } 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; }}-------------------------------package com.kmedoids;import java.util.ArrayList;public class Medoid{ private double dimension[]; // 质点的维度 private Cluster cluster; //所属类簇 private double etdDisSum;//Medoid到本类簇中所有的欧式距离之和 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; }}--------------------------package com.kmedoids;import java.util.ArrayList;public class ClusterAnalysis { private 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("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; }}--------------------------------------------package com.kmedoids;import java.util.ArrayList;import java.util.Iterator;public class TestMain { public static void main (String args[]){ ArrayList<DataPoint> dataPoints = new ArrayList<DataPoint>(); double[] a={2,3}; double[] b={2,4}; double[] c={1,4}; double[] d={1,3}; double[] e={2,2}; double[] f={3,2}; double[] g={8,7}; double[] h={8,6}; double[] i={7,7}; double[] j={7,6}; double[] k={8,5}; double[] l={100,2};//孤立点 double[] m={8,20}; double[] n={8,19}; double[] o={7,18}; double[] p={7,17}; double[] q={7,20}; dataPoints.add(new DataPoint(a,"a")); dataPoints.add(new DataPoint(b,"b")); dataPoints.add(new DataPoint(c,"c")); dataPoints.add(new DataPoint(d,"d")); dataPoints.add(new DataPoint(e,"e")); dataPoints.add(new DataPoint(f,"f")); dataPoints.add(new DataPoint(g,"g")); dataPoints.add(new DataPoint(h,"h")); dataPoints.add(new DataPoint(i,"i")); dataPoints.add(new DataPoint(j,"j")); dataPoints.add(new DataPoint(k,"k")); dataPoints.add(new DataPoint(l,"l")); dataPoints.add(new DataPoint(m,"m")); dataPoints.add(new DataPoint(n,"n")); dataPoints.add(new DataPoint(o,"o")); dataPoints.add(new DataPoint(p,"p")); dataPoints.add(new DataPoint(q,"q")); ClusterAnalysis ca=new ClusterAnalysis(3,0,dataPoints,2); double[][] cen={{8,7},{8,6},{7,7}}; ca.startAnalysis(cen); ArrayList<DataPoint>[] v = ca.getClusterOutput(); for (int ii=0; ii<v.length; ii++){ ArrayList tempV = v[ii]; System.out.println("-----------Cluster"+ii+"---------"); Iterator iter = tempV.iterator(); while(iter.hasNext()){ DataPoint dpTemp = (DataPoint)iter.next(); System.out.println(dpTemp.getPointName()); } } }}
0 0
- K中心点算法(K-medoids) java实现
- K中心点算法(K-medoids)
- k-medoids 算法思想
- K-Means 和K-Medoids算法及其MATLAB实现
- K-Means 和K-Medoids算法及其MATLAB实现
- K-mediods(K中心点)算法
- 聚类分析--k中心点算法
- 聚类分析--k中心点算法
- 聚类 K-means & K-medoids 算法
- K-means 和 K-medoids算法聚类分析
- 数据挖掘聚类之k-medoids算法实现
- 聚类分析(三) K中心点算法(k-mediods)
- 聚类分析之K中心点算法(k-mediods)
- K-中心点聚类算法(K-Medoide)
- 聚类算法之k-medoids算法
- K中心点聚类算法
- K中心点
- k-medoids与k-Means聚类算法的异同
- 有关按钮的触摸优先级和layer的触摸事件冲突问题
- iOS应用架构谈 网络层设计方案
- IP地址和端口号详细解析
- Longest Common Prefix
- GO语言学习: 项目构建 及编译 初步
- K中心点算法(K-medoids) java实现
- Android异步批量下载图片并缓存
- 通过java的反射机制实现Map、JavaBean、JSON的相互转换工具类
- java虚拟机1
- TCP 的那些事儿(下)
- CRC32 算法
- 用mediastreamer2建立一个音频RTP流
- hdu5256序列变换(非递减子序列)
- HDU2473 并查集的删除