码迷,mamicode.com
首页 > 编程语言 > 详细

Java实现聚类算法k-means

时间:2016-07-02 21:30:03      阅读:329      评论:0      收藏:0      [点我收藏+]

标签:

2016-07-02

java简单实现聚类算法(以前的作业,想记录下的时候,貌似语法都忘记了,,,呜呜呜)

但是有一个小问题,,,,我其实每次迭代之后(就是达不到我的收敛标准之前【好纠结呀这句话,还打不到,还之前,OMG】,就是聚类中心的误差达不到指定小的时候),,,我虽然重新算了聚类中心,但是其实我的那些点并没有变,可是这个程序不知道咋回事每次都把我原先随机指定的聚类中心给变成了我算的聚类中心,说不明白,,,,怎么用,按照指示来就行了,不用读文件(源码全都是可以运行的,反正在我这个几几上是木有错误,我才往上贴的,有的不足之处还望批评指正)输出的结果有一堆小数的那是新聚类中心和老的的误差值,在没有达到指定小的时候,是不会停的。

技术分享

技术分享

 

  1 import java.sql.Array;
  2 import java.util.ArrayList;
  3 import java.util.Random;
  4 import java.util.Scanner;
  5 
  6 class point {
  7     public float x = 0;
  8     public float y = 0;
  9     public int flage = -1;
 10 
 11     public float getX() {
 12         return x;
 13     }
 14 
 15     public void setX(float x) {
 16         this.x = x;
 17     }
 18 
 19     public float getY() {
 20         return y;
 21     }
 22 
 23     public void setY(float y) {
 24         this.y = y;
 25     }
 26 }
 27 
 28 public class Kcluster {
 29 
 30     point[] ypo;// 点集
 31     point[] pacore = null;// old聚类中心
 32     point[] pacoren = null;// new聚类中心
 33 
 34     // 初试聚类中心,点集
 35     public void productpoint() {
 36         Scanner cina = new Scanner(System.in);
 37         System.out.print("请输入聚类中点的个数(随机产生):");
 38         int num = cina.nextInt();
 39 
 40         ypo = new point[num];
 41         // 随机产生点
 42         for (int i = 0; i < num; i++) {
 43 
 44             float x = (int) (new Random().nextInt(10));
 45             float y = (int) (new Random().nextInt(10));
 46 
 47             ypo[i] = new point();// 对象创建
 48             ypo[i].setX(x);
 49             ypo[i].setY(y);
 50 
 51         }
 52 
 53         // 初始化聚类中心位置
 54         System.out.print("请输入初始化聚类中心个数(随机产生):");
 55         int core = cina.nextInt();
 56         this.pacore = new point[core];// 存放聚类中心
 57         this.pacoren = new point[core];
 58 
 59         Random rand = new Random();
 60         int temp[] = new int[core];
 61         temp[0] = rand.nextInt(num);
 62         pacore[0] = new point();
 63         pacore[0] = ypo[temp[0]];
 64         // 避免产生重复的中心
 65         for (int i = 1; i < core; i++) {
 66             int flage = 0;
 67             int thistemp = rand.nextInt(num);
 68             for (int j = 0; j < i; j++) {
 69                 if (temp[j] == thistemp) {
 70                     flage = 1;// 有重复
 71                     break;
 72 
 73                 }
 74             }
 75             if (flage == 1) {
 76                 i--;
 77             } else {
 78                 pacore[i] = new point();
 79                 pacore[i] = ypo[thistemp];
 80                 pacore[i].flage = 0;// 0表示聚类中心
 81             }
 82 
 83         }
 84         System.out.println("初始聚类中心:");
 85         for (int i = 0; i < pacore.length; i++) {
 86             System.out.println(pacore[i].x + " " + pacore[i].y);
 87         }
 88 
 89     }
 90 
 91     // ///找出每个点属于哪个聚类中心
 92     public void searchbelong()// 找出每个点属于哪个聚类中心
 93     {
 94 
 95         for (int i = 0; i < ypo.length; i++) {
 96             double dist = 999;
 97             int lable = -1;
 98             for (int j = 0; j < pacore.length; j++) {
 99 
100                 double distance = distpoint(ypo[i], pacore[j]);
101                 if (distance < dist) {
102                     dist = distance;
103                     lable = j;
104                     // po[i].flage = j + 1;// 1,2,3......
105 
106                 }
107             }
108             ypo[i].flage = lable + 1;
109 
110         }
111 
112     }
113 
114     // 更新聚类中心
115     public void calaverage() {
116 
117         for (int i = 0; i < pacore.length; i++) {
118             System.out.println("以<" + pacore[i].x + "," + pacore[i].y
119                     + ">为中心的点:");
120             int numc = 0;
121             point newcore = new point();
122             for (int j = 0; j < ypo.length; j++) {
123 
124                 if (ypo[j].flage == (i + 1)) {
125                     numc += 1;
126                     newcore.x += ypo[j].x;
127                     newcore.y += ypo[j].y;
128                     System.out.println(ypo[j].x + "," + ypo[j].y);
129                 }
130             }
131             // 新的聚类中心
132             pacoren[i] = new point();
133             pacoren[i].x = newcore.x / numc;
134             pacoren[i].y = newcore.y / numc;
135             pacoren[i].flage = 0;
136             System.out.println("新的聚类中心:" + pacoren[i].x + "," + pacoren[i].y);
137 
138         }
139     }
140 
141     public double distpoint(point px, point py) {
142 
143         return Math.sqrt(Math.pow((px.x - py.x), 2)
144                 + Math.pow((px.y - py.y), 2));
145 
146     }
147 
148     public void change_oldtonew(point[] old, point[] news) {
149         for (int i = 0; i < old.length; i++) {
150             old[i].x = news[i].x;
151             old[i].y = news[i].y;
152             old[i].flage = 0;// 表示为聚类中心的标志。
153         }
154     }
155 
156     public void movecore() {
157         // this.productpoint();//初始化,样本集,聚类中心,
158         this.searchbelong();
159         this.calaverage();//
160         double movedistance = 0;
161         int biao = -1;//标志,聚类中心点的移动是否符合最小距离
162         for (int i = 0; i < pacore.length; i++) {
163             movedistance = distpoint(pacore[i], pacoren[i]);
164             System.out.println("distcore:" + movedistance);//聚类中心的移动距离
165             if (movedistance < 0.01) {
166                 biao = 0;
167 
168             } else {
169                 
170                 biao=1;
171                 break;
172 
173             }
174         }
175         if (biao == 0) {
176             System.out.print("迭代完毕!!!!!");
177         } else {
178             change_oldtonew(pacore, pacoren);
179             movecore();
180         }
181 
182     }
183 
184     public static void main(String[] args) {
185         // TODO Auto-generated method stub
186 
187         Kcluster kmean = new Kcluster();
188         kmean.productpoint();
189         kmean.movecore();
190     }
191 
192 }

也是一个Java泛型的应用,,,,因为老师说这个比较重要,应用方便快捷。我写的东西一般比较乱,不上档次,只是比较简单而已。

 

Java实现聚类算法k-means

标签:

原文地址:http://www.cnblogs.com/8335IT/p/5635965.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!