java密度聚类-密度最大处,点最密集处

                                           

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)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值