当前位置: 首页 > >

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

发布时间:

2019独角兽企业重金招聘Python工程师标准>>>



//写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> pointCenter=null;
?? ?//初始数据集合
?? ?public static List 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 point=new ArrayList<>();
?? ??? ??? ?DataBean basePoint=oriList.get(0);
?? ??? ??? ?point.add(basePoint);
?? ??? ??? ?oriList.remove(0);
?? ??? ??? ?int index=0;
?? ??? ??? ?while(index
?? ??? ??? ??? ?if(getDistance(basePoint,oriList.get(index))
?? ??? ??? ??? ??? ?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
?? ??? ??? ?for(int j=0;j
?? ??? ??? ??? ?System.out.println(pointCenter.get(i).get(j).getX()+" ?"+pointCenter.get(i).get(j).getY());
?? ??? ??? ?}
?? ??? ?}
?? ??? ?
?? ??? ?//将分类后的数据写入到json文件
?? ??? ?//writeJson(pointCenter);


?? ?}
?? ?
?? ?//是否需要对集合里面的元素进行排序???
?? ?
?? ?//构造初始一个数据集合,count代表需要初始化的数据的数量
?? ?public static List getList(int count){
?? ??? ?List oriList=new ArrayList<>();
?? ??? ?for(int i=0;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 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> pointCenter){
?? ??? ?String str="";
?? ??? ?for(int k=0;k
?? ??? ??? ?if(k==0){
?? ??? ??? ??? ?str=str+"[{"canopy":[";
?? ??? ??? ?}
?? ??? ??? ?else{
?? ??? ??? ??? ?str=str+"{"canopy":[";
?? ??? ??? ?}
?? ??? ??? ?for(int i=0;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);
?? ?}
}








转载于:https://my.oschina.net/dreamerliujack/blog/808701






相关资源:K-Means算法简介及最新改进Java代码实现



友情链接: