java密度聚类的demo(亲测)

package com.test.demo.gua;

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

public class K_meanTest {
    public static void main(String[] args){
        List<Double> x=new ArrayList<>();
        List<Double> y=new ArrayList<>();

        x.add(2.0);
        y.add(1.0);

        x.add(3.0);
        y.add(2.0);

        x.add(4.0);
        y.add(3.0);

        x.add(5.0);
        y.add(4.0);

        x.add(6.0);
        y.add(5.0);

        x.add(2.1);
        y.add(5.1);

        x.add(2.2);
        y.add(5.2);

        x.add(2.3);
        y.add(5.3);

        x.add(2.4);
        y.add(5.5);

        x.add(2.5);
        y.add(5.6);

        x.add(5.0);
        y.add(18.0);


        double[] xu=getCollectCenterValue(y, x);

        System.out.print(xu[0]);

    }
    /**
     * //密度计算,思路:我们是否可以找到一个点使得,这个点到其他距离最短
     * @param x  x表示时间
     * @param y  y表示时间对应的值
     * @return
     */
    public static double[] getCollectCenterValue(List<Double> x, List<Double> y){
        //存放的目标值
        double[] goal=new double[2];
        double radius=1;
        double xx=0;
        double yy=0;
        double lin=0;
        List<List<Double>> cu=new ArrayList<>();
        //存放时间
        List<List<Double>> time=new ArrayList<>();
        List<List<Double>> value=new ArrayList<>();
        for(int i=0;i<x.size();i++){
            List<Double> line=new ArrayList<>();
            List<Double> tim=new ArrayList<>();
            List<Double> val=new ArrayList<>();
            for(int j=0;j<x.size();j++){
                xx=Math.pow((x.get(i)-x.get(j)),2);
                yy=Math.pow((y.get(i)-y.get(j)),2);
                lin=Math.sqrt(xx+yy);
                if(lin<radius){
                    line.add(lin);
                    tim.add(x.get(j));
                    val.add(y.get(j));
                }
            }
            cu.add(line);
            time.add(tim);
            value.add(val);
        }
        //存放下标的集合
        List<Integer> lisort=new ArrayList<>();
        for(int k=0;k<cu.size();k++){
            lisort.add(cu.get(k).size());
        }
        int count=getMaxX(lisort);//数量帅选
        //根据值找出下标
        int index=0;
        for(int n=0;n<lisort.size();n++){
            if(lisort.get(n)== count){
                index=n;
            }
        }
        //根据下标找出值(找出目标簇)
        List<Double> ng=value.get(index); //存放值
        List<Double> tt=time.get(index);  //存放时间
        //根据找出的值,求一个均值
        double av=getAvg(ng);
        double av_time=getAvg(tt);
        goal[0]=av;
        goal[1]=av_time;
        return goal;
    }
    //集合取极大值
    public static Integer getMaxX(List<Integer> numbers){
        int max =  Collections.max(numbers);
        return max;
    }

    public static double getAvg(List<Double> list){
        double eavg=0;
        for(int i=0;i<list.size();i++){
            eavg+=list.get(i);
        }
        eavg=eavg/list.size();
        return eavg;
    }
}

标记:在点少的情况下使用这个方法,可以把密集密度的数据筛选出来,上面的代码主要是筛选出密度区域,然给区域找出一个中心点(x,y)|(av_time,av)

猜你喜欢

转载自blog.csdn.net/chehec2010/article/details/114628818