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)