package com.baorant;
import java.io.File;
import java.util.Random;
/*
* 聚类得到数据中心
*/
public class JuLei {
point[] ypo;// 点集
point[] pacore = null;// old聚类中心
point[] pacoren = null;// new聚类中心
// 初试聚类中心,点集
public void productpoint(int[] datas) {
int num = datas.length;
ypo = new point[num];
for (int i = 0; i < num; i++) {
float x = 0;
float y = datas[i];
ypo[i] = new point();// 对象创建
ypo[i].setX(x);
ypo[i].setY(y);
}
// 初始化聚类中心位置
System.out.print("请输入初始化聚类中心个数(随机产生):");
int core = 3;
this.pacore = new point[core];// 存放聚类中心
this.pacoren = new point[core];
Random rand = new Random();
int temp[] = new int[core];
temp[0] = rand.nextInt(num);
pacore[0] = new point();
pacore[0].x = ypo[temp[0]].x;
pacore[0].y = ypo[temp[0]].y;
pacore[0].flage = 0;
// 避免产生重复的中心
for (int i = 1; i < core; i++) {
int flage = 0;
int thistemp = rand.nextInt(num);
for (int j = 0; j < i; j++) {
if (temp[j] == thistemp) {
flage = 1;// 有重复
break;
}
}
if (flage == 1) {
i--;
} else {
pacore[i] = new point();
pacore[i].x = ypo[thistemp].x;
pacore[i].y = ypo[thistemp].y;
pacore[i].flage = 0;// 0表示聚类中心
}
}
System.out.println("初始聚类中心:");
for (int i = 0; i < pacore.length; i++) {
System.out.println(pacore[i].x + " " + pacore[i].y);
}
}
// ///找出每个点属于哪个聚类中心
public void searchbelong()// 找出每个点属于哪个聚类中心
{
for (int i = 0; i < ypo.length; i++) {
double dist = 999;
int lable = -1;
for (int j = 0; j < pacore.length; j++) {
double distance = distpoint(ypo[i], pacore[j]);
if (distance < dist) {
dist = distance;
lable = j;
// po[i].flage = j + 1;// 1,2,3......
}
}
ypo[i].flage = lable + 1;
}
}
// 更新聚类中心
public void calaverage() {
for (int i = 0; i < pacore.length; i++) {
System.out.println("以<" + pacore[i].x + "," + pacore[i].y + ">为中心的点:");
int numc = 0;
point newcore = new point();
for (int j = 0; j < ypo.length; j++) {
if (ypo[j].flage == (i + 1)) {
System.out.println(ypo[j].x + "," + ypo[j].y);
numc += 1;
newcore.x += ypo[j].x;
newcore.y += ypo[j].y;
}
}
// 新的聚类中心
pacoren[i] = new point();
pacoren[i].x = newcore.x / numc;
pacoren[i].y = newcore.y / numc;
pacoren[i].flage = 0;
System.out.println("新的聚类中心:" + pacoren[i].x + "," + pacoren[i].y);
}
}
public double distpoint(point px, point py) {
return Math.sqrt(Math.pow((px.x - py.x), 2) + Math.pow((px.y - py.y), 2));
}
public void change_oldtonew(point[] old, point[] news) {
for (int i = 0; i < old.length; i++) {
old[i].x = news[i].x;
old[i].y = news[i].y;
old[i].flage = 0;// 表示为聚类中心的标志。
}
}
public void movecore() {
// this.productpoint();//初始化,样本集,聚类中心,
this.searchbelong();
this.calaverage();//
double movedistance = 0;
int biao = -1;// 标志,聚类中心点的移动是否符合最小距离
for (int i = 0; i < pacore.length; i++) {
movedistance = distpoint(pacore[i], pacoren[i]);
System.out.println("distcore:" + movedistance);// 聚类中心的移动距离
if (movedistance < 0.01) {
biao = 0;
} else {
biao = 1;// 需要继续迭代,
break;
}
}
if (biao == 0) {
System.out.print("迭代完毕!!!!!");
} else {
change_oldtonew(pacore, pacoren);
movecore();
}
}
public static void main(String[] args) {
File csv = new File("csv//1203.csv"); // CSV文件路径
int[] records = GetExcelData.returnFinalArray(csv);
for(int i = 0; i < records.length; i++){
System.out.print(records[i] + " ");
}
System.out.println();
System.out.println("打印聚类中心:");
JuLei juLei = new JuLei();
juLei.productpoint(records);
juLei.movecore();
System.out.println();
for(int j = 0; j < juLei.pacoren.length; j++){
System.out.println(juLei.pacoren[j].x + " " + juLei.pacoren[j].y);
}
}
}
class point {
public float x = 0;
public float y = 0;
public int flage = -1;
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
}