分箱
参考文章:
[集合排序](https://blog.csdn.net/hu_shengyang/article/details/6249309)
离群点分析
异常点/离群点检测算法-Lof
整个分箱法的算法没有什么难度,重点在于离群点分析,这里对离群点的分析采用局部异常因子算法(Lof),具体代码参考参考文献。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140package data_mining;
import java.util.ArrayList;
import java.util.Collections;
/*文中不包含离群点分析*/
//import java.util.Scanner;
public class Fenxiang {
	private ArrayList<Integer> data;
	private ArrayList<Integer> box;
	private ArrayList<Integer> border;
	public Fenxiang(ArrayList<Integer> d) {
		
		this.data=sort(d);
	}
	public Fenxiang() {
		
	}
	
public ArrayList<Integer> sort(ArrayList<Integer> al) {//分箱法中data集合赋值后直接进行排序
//    int[] arr1={1,3,5,7,9};
//    int[] arr2={2,4,6,8,10};
////    List<Comparable> al = new ArrayList<Comparable>();
//    ArrayList<Integer> al = new ArrayList<Integer>();
//    for(int i=0;i<arr1.length;i++){
//        al.add(arr1[i]);
//    }
//    System.out.println(al);
//    for(int j=0;j<arr2.length;j++){
//        al.add(arr2[j]);
//    }
//    System.out.println(al);
/*  Iterator<Comparable> it=al.iterator();
    Integer obj = null;
    while(it.hasNext()){
        obj=(Integer)it.next();    
        al.add(obj.intValue());
    }
    */
    Collections.sort(al);//对数组排序
    //Arrays.sort(al.toArray());//对list排序
//    System.out.println(al);
    return al;
}
//	public void scan(Scanner s) {
//		data.add(s.nextInt());
//	}
	public void setData(ArrayList<Integer> d) {
		this.data=sort(d);
	}
	public ArrayList<Integer> average(int n) {//向下取整average,箱深度为n
		ArrayList<Integer> box1=new ArrayList<Integer>();
		for(int i=0;i<data.size();i=i+n) {
			int ave=0;
			if(data.size()-i<n) {
				for(int j=0;j<data.size()-i;j++) {
					ave+=data.get(i+j);
				}
				ave=ave/(data.size()-i);
				box1.add(ave);
			}else {
				for(int j=0;j<n;j++) {
					ave+=data.get(i+j);
				}
				ave=ave/(n);
//				System.out.println(ave);
				box1.add(ave);
			}
		}
		setBox(box1);
		return box1;
	}
	public void showBorder(int n) {
		for(int i=0;i<border.size();i+=n) {
			System.out.print("箱"+((i/n)+1)+": ");
			for(int j=0;j<n;j++) {
				System.out.print(border.get(i+j)+" ");
			}
			System.out.println();
		}
	}
	public ArrayList<Integer> border(int n){
		ArrayList<Integer> bo=new ArrayList<Integer>();
		for(int i=0;i<data.size();i=i+n) {
			bo.add(data.get(i));
			for(int j=1;j<n-1;j++) {
				if((data.get(i+j)-data.get(i))<(data.get(i+n-1)-data.get(i+j))) {
					bo.add(data.get(i));
				}else {
					bo.add(data.get(i+n-1));
				}
			}
			bo.add(data.get(i+n-1));
		}
		this.border=bo;
		return bo;
	}
	public ArrayList<Integer> Mediam(int n) {//取中位数,箱深度为n
		ArrayList<Integer> box1=new ArrayList<Integer>();
		for(int i=0;i<data.size();i=i+n) {
			int med=0;
			if(data.size()-i<n) {
				if((data.size()-i)/2==0) {
					med=(data.get(i+(data.size()-i)/2)+data.get(i+(data.size()-i)/2-1))/2;
				}else {
				med=(data.get(i+(data.size()-i)/2));}
				med=med/(data.size()-i);
				box1.add(med);
			}else {
				if(n/2==0) {
					med=(data.get(i+n/2)+data.get(i+n/2-1))/2;
				}else {
				med=(data.get(i+n/2));}
//				System.out.println(ave);
				box1.add(med);
			}
		}
		setBox(box1);
		return box1;
	}
	public ArrayList<Integer> getBox() {
		return box;
	}
	public void setBox(ArrayList<Integer> box) {
		this.box = box;
	}
	public void showData(){
		for(int i=0;i<data.size();i++) {
			if(i==10) System.out.println(" ");
			System.out.print(data.get(i)+"  ");
		}
	}
	public void showBox(){
		for(int i=0;i<box.size();i++) {
			if(i==10) System.out.println(" ");
			System.out.print(box.get(i)+"  ");
		}
	}
	
	
	
}
1  | package data_mining;  |