您的位置:首页 > 编程语言 > Java开发

K_Means优化算法之Canopy算法----java简单实现

2016-12-19 00:00 435 查看
//写Json代码暂不公开

模拟数据,聚类结果:



Bean结构:

package canopy;

public class DataBean {
public static void main(String[] args){

}
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}

核心代码和思想:

package canopy;

import java.util.ArrayList;
import java.util.List;

public class Canopy {
//设置初始T2的距离
public static double T2=0;
//计算出初始T1的距离--设置T1=2*T2
public static double T1=0;
//用一个集合用来存放每个canopy初始点
//最后,这个集合的长度就是canopy的个数(可以用来作为kMeans中心点的个数)
//里面对应的每个点就可以作为kMeans初始中心点的位置
public static List<List<DataBean>> pointCenter=null;
//初始数据集合
public static List<DataBean> oriList=null;

public static void main(String[] args){
//初始数据集合
oriList=getList(300);
//设置样本数量为300,计算出初始T2距离
T2=getT2(oriList);
//计算出初始T1距离
//T1=2*T2;
//用来存放每个canopy的第一个比较点
pointCenter=new ArrayList<>();
//开始迭代分类
while(0!=oriList.size()){
List<DataBean> point=new ArrayList<>();
DataBean basePoint=oriList.get(0);
point.add(basePoint);
oriList.remove(0);
int index=0;
while(index<oriList.size()){
if(getDistance(basePoint,oriList.get(index))<T2){
point.add(oriList.get(index));
oriList.remove(index);
}
else{
index++;
}
}
pointCenter.add(point);
}

System.out.println("canopy个数:"+pointCenter.size());
System.out.println("每个canopy其实点的位置:");
for(int i=0;i<pointCenter.size();i++){
for(int j=0;j<pointCenter.get(i).size();j++){
System.out.println(pointCenter.get(i).get(j).getX()+" "+pointCenter.get(i).get(j).getY());
}
}

//将分类后的数据写入到json文件
//writeJson(pointCenter);

}

//是否需要对集合里面的元素进行排序???

//构造初始一个数据集合,count代表需要初始化的数据的数量
public static List<DataBean> getList(int count){
List<DataBean> oriList=new ArrayList<>();
for(int i=0;i<count;i++){
DataBean dataBean=new DataBean();
//产生1-100之间的随机数存入初始集合
dataBean.setX((int)(Math.random()*100)+1);
dataBean.setY((int)(Math.random()*100)+1);
oriList.add(dataBean);
}
return oriList;
}

//计算出初始T2的距离
public static double getT2(List<DataBean> points) {
double sum = 0;
int pointSize = points.size();
for (int i = 0; i < pointSize; i++) {
for (int j = 0; j < pointSize; j++) {
if (i == j)
continue;
DataBean pointA = points.get(i);
DataBean pointB = points.get(j);
sum += Math.sqrt((pointA.getX() - pointB.getX()) * (pointA.getX() - pointB.getX())
+ (pointA.getY() - pointB.getY()) * (pointA.getY() - pointB.getY()));
}
}
int distanceNumber = pointSize * (pointSize + 1) / 2;
double T2 = sum / distanceNumber / 2; // 平均距离的一半
return T2;
}

//得到两个点之间的距离
public static double getDistance(DataBean pointA,DataBean pointB){
double distance=0;
distance=Math.sqrt(Math.pow((pointA.getX() - pointB.getX()), 2.0) + Math.pow((pointA.getY() - pointB.getY()), 2.0));
//小数点后保留两位
distance=(double)(Math.round(distance*100)/100.0);
return distance;
}

//把数据写到json文件里面去
public static void writeJson(List<List<DataBean>> pointCenter){
String str="";
for(int k=0;k<pointCenter.size();k++){
if(k==0){
str=str+"[{\"canopy\":[";
}
else{
str=str+"{\"canopy\":[";
}
for(int i=0;i<pointCenter.get(k).size();i++){

if(i!=pointCenter.get(k).size()-1)
{
str=str+"["+pointCenter.get(k).get(i).getX()+","+pointCenter.get(k).get(i).getY()+"],";
}
else{
str=str+"["+pointCenter.get(k).get(i).getX()+","+pointCenter.get(k).get(i).getY()+"]";
}
}
if(k!=pointCenter.size()-1){
str=str+"]},";
}
else{
str=str+"]}]";
}
}
WriteJson.saveJsonData("canopy",str);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息