|
@@ -0,0 +1,313 @@
|
|
|
+//package k;
|
|
|
+//
|
|
|
+//
|
|
|
+//import java.math.BigDecimal;
|
|
|
+//import java.math.RoundingMode;
|
|
|
+//import java.util.*;
|
|
|
+//import java.util.stream.Collectors;
|
|
|
+//
|
|
|
+//public class KMeansX {
|
|
|
+// //定义初始数据集
|
|
|
+// public static List<Point> dataList = new ArrayList<>();
|
|
|
+// //定义簇的数目
|
|
|
+// public static Integer k = 4;
|
|
|
+//
|
|
|
+// public static void main(String[] args) {
|
|
|
+// //初始化数据集和初始簇
|
|
|
+// initDataList();
|
|
|
+// List<Cluster> clusterList = getInitCluster();
|
|
|
+// while(true){
|
|
|
+// for (int j = 0; j < k; j++) {
|
|
|
+// clusterList.get(j).getSameList().clear();
|
|
|
+// }
|
|
|
+// for (Point point : dataList) {
|
|
|
+// int index = getBelongCluster(point, clusterList); //获取point属于的那个簇在clusterList中的下标
|
|
|
+// clusterList.get(index).getSameList().add(point); //把point加入到clusterList的对应簇中;
|
|
|
+// }
|
|
|
+// if (!calculateClusterCore(clusterList)) break;
|
|
|
+// }
|
|
|
+// for (Cluster cluster : clusterList) {
|
|
|
+// System.out.println(cluster);
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 计算出新的簇中心并返回簇的点集合是否有变化
|
|
|
+// * @param clusterList
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public static boolean calculateClusterCore(List<Cluster> clusterList){
|
|
|
+// boolean flag = false;
|
|
|
+// //遍历簇集合中的每一项,更新其簇中心
|
|
|
+// for (Cluster cluster : clusterList) {
|
|
|
+// List<Point> sameList = cluster.getSameList();
|
|
|
+// if (sameList.size()==0){
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+// double sumX = 0; //存放簇中点集合所有的X坐标之和
|
|
|
+// // double sumY = 0; //存放簇中点集合所有的Y坐标之和
|
|
|
+// for (Point point : sameList) {
|
|
|
+// sumX += point.getX();
|
|
|
+// // sumY += point.getY();
|
|
|
+// }
|
|
|
+// BigDecimal bigDecimal = BigDecimal.valueOf(sumX).divide(BigDecimal.valueOf(sameList.size()),2,RoundingMode.HALF_UP);
|
|
|
+// //更新簇的中心
|
|
|
+// Point clusterCore = new Point(bigDecimal.doubleValue());
|
|
|
+// if (!Point.getIsSame(clusterCore, cluster.getCorePoint())) flag = true;
|
|
|
+// cluster.setCorePoint(clusterCore);
|
|
|
+// }
|
|
|
+// return flag;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取某个点属于哪个簇的下标
|
|
|
+// * @param point
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public static int getBelongCluster(Point point, List<Cluster> clusterList){
|
|
|
+// double closestDistance = 0.0; //存放point距离簇中心最近的距离
|
|
|
+// int resultClusterIndex = 0; //存放point属于的那个簇的下标
|
|
|
+// int index = 0;
|
|
|
+// //遍历簇集合,计算point到簇中心的距离,找出point属于的簇
|
|
|
+// for (Cluster cluster : clusterList) {
|
|
|
+// double distance = Point.calculateMHDDistance(point, cluster.getCorePoint());
|
|
|
+// if (index == 0) closestDistance = distance;
|
|
|
+// if (distance < closestDistance){
|
|
|
+// closestDistance = distance;
|
|
|
+// resultClusterIndex = index;
|
|
|
+// }
|
|
|
+// index++;
|
|
|
+// }
|
|
|
+// return resultClusterIndex;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取任意k个对象作为初始簇中心,将含有k个簇的集合返回
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public static List<Cluster> getInitCluster(){
|
|
|
+// List<Cluster> clusterList = new ArrayList<>();
|
|
|
+// List<Integer> randomArray = getRandomList();
|
|
|
+// //任意选取k个对象作为初始簇中心,数据集中k个对象的下标存放在randomArray中
|
|
|
+// for (int i = 0; i < randomArray.size(); i++) {
|
|
|
+// Point point = dataList.get(randomArray.get(i));
|
|
|
+// Cluster cluster = new Cluster(point);
|
|
|
+// clusterList.add(cluster);
|
|
|
+// }
|
|
|
+// return clusterList;
|
|
|
+// }
|
|
|
+//
|
|
|
+//// /**
|
|
|
+//// * 获取含有k个不重复随机数的数组
|
|
|
+//// * @return
|
|
|
+//// */
|
|
|
+//// public static int[] getRandomArray(){
|
|
|
+//// Random random = new Random();
|
|
|
+//// int[] randomArray = new int[k];
|
|
|
+//// for (int i = 0; i < k; i++) {
|
|
|
+//// int randomItem = random.nextInt(5);
|
|
|
+//// //为保证randomArray中存放的随机数不重复
|
|
|
+//// while (Arrays.binarySearch(randomArray, randomItem) >= 0) randomItem = random.nextInt(5);
|
|
|
+//// randomArray[i] = randomItem;
|
|
|
+//// }
|
|
|
+//// return randomArray;
|
|
|
+//// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 随机获取中心
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// public static List<Integer> getRandomList(){
|
|
|
+// List<Integer> collect = new ArrayList<>();
|
|
|
+// Random random = new Random();
|
|
|
+// for (int i =0 ; i<k; i++){
|
|
|
+// int r = random.nextInt(dataList.size());
|
|
|
+// while (collect.contains(r)){
|
|
|
+// r = random.nextInt(dataList.size());
|
|
|
+// }
|
|
|
+// collect.add(r);
|
|
|
+// }
|
|
|
+// return collect;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 初始化数据集
|
|
|
+// */
|
|
|
+// public static void initDataList(){
|
|
|
+// Point p1 = new Point(13.77);
|
|
|
+// Point p2 = new Point(13.77);
|
|
|
+// Point p3 = new Point(13.77);
|
|
|
+// Point p4 = new Point(13.77);
|
|
|
+// Point p5 = new Point(13.77);
|
|
|
+// Point p6 = new Point(15.46);
|
|
|
+// Point p7 = new Point(13.77);
|
|
|
+// Point p8 = new Point(13.77);
|
|
|
+// Point p9 = new Point(13.77);
|
|
|
+// Point p10 = new Point(15.46);
|
|
|
+// Point p11 = new Point(13.77);
|
|
|
+// Point p12 = new Point(13.77);
|
|
|
+// Point p13 = new Point(29.21);
|
|
|
+// Point p14 = new Point(29.21);
|
|
|
+// Point p15 = new Point(15.46);
|
|
|
+// Point p16 = new Point(13.77);
|
|
|
+// Point p17 = new Point(12.64);
|
|
|
+// Point p18 = new Point(12.64);
|
|
|
+// Point p19 = new Point(15.64);
|
|
|
+// Point p20 = new Point(31.19);
|
|
|
+// Point p21 = new Point(12.64);
|
|
|
+// Point p22 = new Point(31.19);
|
|
|
+// Point p23 = new Point(31.19);
|
|
|
+// Point p24 = new Point(43.84);
|
|
|
+// Point p25 = new Point(15.46);
|
|
|
+// Point p26 = new Point(31.19);
|
|
|
+// Point p27 = new Point(80.72);
|
|
|
+// Point p28 = new Point(28.72);
|
|
|
+// Point p29 = new Point(15.64);
|
|
|
+// Point p30 = new Point(15.64);
|
|
|
+// Point p31 = new Point(13.77);
|
|
|
+// Point p32 = new Point(34.52);
|
|
|
+// Point p33 = new Point(13.77);
|
|
|
+// Point p34 = new Point(38.18);
|
|
|
+// Point p35 = new Point(42.49);
|
|
|
+// Point p36 = new Point(34.52);
|
|
|
+// Point p37 = new Point(31.19);
|
|
|
+// Point p38 = new Point(42.49);
|
|
|
+// Point p39 = new Point(12.92);
|
|
|
+// Point p40 = new Point(50.39);
|
|
|
+// Point p41 = new Point(52.93);
|
|
|
+// Point p42 = new Point(12.64);
|
|
|
+// Point p43 = new Point(43.48);
|
|
|
+// Point p44 = new Point(43.48);
|
|
|
+// Point p45 = new Point(31.19);
|
|
|
+// Point p46 = new Point(31.19);
|
|
|
+// Point p47 = new Point(31.19);
|
|
|
+// Point p48 = new Point(56.60);
|
|
|
+// Point p49 = new Point(31.19);
|
|
|
+// Point p50 = new Point(64.93);
|
|
|
+// Point p51 = new Point(64.93);
|
|
|
+// Point p52 = new Point(31.19);
|
|
|
+// Point p53 = new Point(91.60);
|
|
|
+// Point p54 = new Point(91.60);
|
|
|
+// Point p55 = new Point(31.19);
|
|
|
+// Point p56 = new Point(31.19);
|
|
|
+// Point p57 = new Point(91.60);
|
|
|
+// Point p58 = new Point(50.88);
|
|
|
+// Point p59 = new Point(91.60);
|
|
|
+// Point p60 = new Point(10.66);
|
|
|
+// Point p61 = new Point(50.88);
|
|
|
+// Point p62 = new Point(100.00);
|
|
|
+// Point p63 = new Point(13.77);
|
|
|
+// Point p64 = new Point(30.34);
|
|
|
+// Point p65 = new Point(30.34);
|
|
|
+// Point p66 = new Point(28.93);
|
|
|
+// Point p67 = new Point(28.93);
|
|
|
+// Point p68 = new Point(20.75);
|
|
|
+// Point p69 = new Point(11.79);
|
|
|
+// Point p70 = new Point(12.07);
|
|
|
+// Point p71 = new Point(52.93);
|
|
|
+// Point p72 = new Point(19.69);
|
|
|
+// Point p73 = new Point(42.13);
|
|
|
+// Point p74 = new Point(69.37);
|
|
|
+// Point p75 = new Point(10.66);
|
|
|
+// Point p76 = new Point(12.64);
|
|
|
+// Point p77 = new Point(17.43);
|
|
|
+// Point p78 = new Point(17.43);
|
|
|
+// Point p79 = new Point(12.64);
|
|
|
+// Point p80 = new Point(12.64);
|
|
|
+// Point p81 = new Point(12.64);
|
|
|
+// Point p82 = new Point(17.43);
|
|
|
+// Point p83 = new Point(12.64);
|
|
|
+// Point p84 = new Point(17.43);
|
|
|
+// Point p85 = new Point(17.43);
|
|
|
+// Point p86 = new Point(28.93);
|
|
|
+//
|
|
|
+// dataList.add(p1);
|
|
|
+// dataList.add(p2);
|
|
|
+// dataList.add(p3);
|
|
|
+// dataList.add(p4);
|
|
|
+// dataList.add(p5);
|
|
|
+// dataList.add(p6);
|
|
|
+// dataList.add(p7);
|
|
|
+// dataList.add(p8);
|
|
|
+// dataList.add(p9);
|
|
|
+// dataList.add(p10);
|
|
|
+// dataList.add(p11);
|
|
|
+// dataList.add(p12);
|
|
|
+// dataList.add(p13);
|
|
|
+// dataList.add(p14);
|
|
|
+// dataList.add(p15);
|
|
|
+// dataList.add(p16);
|
|
|
+// dataList.add(p17);
|
|
|
+// dataList.add(p18);
|
|
|
+// dataList.add(p19);
|
|
|
+// dataList.add(p20);
|
|
|
+// dataList.add(p21);
|
|
|
+// dataList.add(p22);
|
|
|
+// dataList.add(p23);
|
|
|
+// dataList.add(p24);
|
|
|
+// dataList.add(p25);
|
|
|
+// dataList.add(p26);
|
|
|
+// dataList.add(p27);
|
|
|
+// dataList.add(p28);
|
|
|
+// dataList.add(p29);
|
|
|
+// dataList.add(p30);
|
|
|
+// dataList.add(p31);
|
|
|
+// dataList.add(p32);
|
|
|
+// dataList.add(p33);
|
|
|
+// dataList.add(p34);
|
|
|
+// dataList.add(p35);
|
|
|
+// dataList.add(p36);
|
|
|
+// dataList.add(p37);
|
|
|
+// dataList.add(p38);
|
|
|
+// dataList.add(p39);
|
|
|
+// dataList.add(p40);
|
|
|
+// dataList.add(p41);
|
|
|
+// dataList.add(p42);
|
|
|
+// dataList.add(p43);
|
|
|
+// dataList.add(p44);
|
|
|
+// dataList.add(p45);
|
|
|
+// dataList.add(p46);
|
|
|
+// dataList.add(p47);
|
|
|
+// dataList.add(p48);
|
|
|
+// dataList.add(p49);
|
|
|
+// dataList.add(p50);
|
|
|
+// dataList.add(p51);
|
|
|
+// dataList.add(p52);
|
|
|
+// dataList.add(p53);
|
|
|
+// dataList.add(p54);
|
|
|
+// dataList.add(p55);
|
|
|
+// dataList.add(p56);
|
|
|
+// dataList.add(p57);
|
|
|
+// dataList.add(p58);
|
|
|
+// dataList.add(p59);
|
|
|
+// dataList.add(p60);
|
|
|
+// dataList.add(p61);
|
|
|
+// dataList.add(p62);
|
|
|
+// dataList.add(p63);
|
|
|
+// dataList.add(p64);
|
|
|
+// dataList.add(p65);
|
|
|
+// dataList.add(p66);
|
|
|
+// dataList.add(p67);
|
|
|
+// dataList.add(p68);
|
|
|
+// dataList.add(p69);
|
|
|
+// dataList.add(p70);
|
|
|
+// dataList.add(p71);
|
|
|
+// dataList.add(p72);
|
|
|
+// dataList.add(p73);
|
|
|
+// dataList.add(p74);
|
|
|
+// dataList.add(p75);
|
|
|
+// dataList.add(p76);
|
|
|
+// dataList.add(p77);
|
|
|
+// dataList.add(p78);
|
|
|
+// dataList.add(p79);
|
|
|
+// dataList.add(p80);
|
|
|
+// dataList.add(p81);
|
|
|
+// dataList.add(p82);
|
|
|
+// dataList.add(p83);
|
|
|
+// dataList.add(p84);
|
|
|
+// dataList.add(p85);
|
|
|
+// dataList.add(p86);
|
|
|
+// }
|
|
|
+//}
|
|
|
+//
|
|
|
+//
|