-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDataSet.java
More file actions
163 lines (137 loc) · 3.98 KB
/
DataSet.java
File metadata and controls
163 lines (137 loc) · 3.98 KB
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package ANN1;
import java.io.*;
import java.util.*;
import javafx.scene.chart.*;
public class DataSet {
File file;
LinkedList<Double[]> datas, traindatas, testdatas, Rdatas;
// 總資料集, 訓練資料集 , 測試資料集 ,預測結果資料集
Double data[];// 單筆資料
int dataSize,dataNum;
LinkedList<Integer> group;// 每類代表數字
int groupArray[];
DataSet(File file) {
this.file = file;
// 處理檔案
try {
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
datas = new LinkedList<Double[]>();
traindatas = new LinkedList<Double[]>();
testdatas = new LinkedList<Double[]>();
dataSize = 0;
group = new LinkedList<Integer>();
// 對每個data做處理
while (br.ready()) {
// split
String[] str = br.readLine().trim().split("(\\s+|,|;)");
if (dataSize == 0) {
dataSize = str.length;
}
// split end
// to double array
Double[] data = new Double[dataSize];
for (int i = 0; i < dataSize; i++) {
data[i] = Double.parseDouble(str[i]);
}
// to double array end
// 分群(確定有幾類)
Iterator<Integer> gitr = group.iterator();
boolean isNewGroup = true;// 判斷此種類是否存在
while (gitr.hasNext()) {
Integer x = new Integer(gitr.next());
if (data[dataSize - 1].intValue() == x) {// 已有族群
isNewGroup = false;
break;
}
}
if (isNewGroup) {// 增加新分類
group.add(data[dataSize - 1].intValue());
}
// 分群end
datas.add(data);
}
// 對每個data做處理 end
} catch (Exception ex) {
System.out.println(ex);
System.out.println("loadfile error");
}
// 處理檔案 end
dataNum =datas.size();
// 依類別分開
groupArray = new int[group.size()];// groupArray[0]=1 => 第0類代表數字為1
Iterator<Integer> gitr = group.iterator();
for (int i = 0; gitr.hasNext(); i++) {
groupArray[i] = gitr.next();
}
Arrays.sort(groupArray);
LinkedList<LinkedList<Double[]>> datasByGroup = new LinkedList<LinkedList<Double[]>>();// 資料集依種類分開
for (int i = 0; i < group.size(); i++) {
datasByGroup.add(new LinkedList<Double[]>());
}
Iterator<Double[]> dItr = datas.iterator();
while (dItr.hasNext()) {
Double[] data = dItr.next();
for (int i = 0; i < groupArray.length; i++) {
if (data[dataSize - 1] == groupArray[i]) {
datasByGroup.get(i).add(data);
break;
}
}
}
// 依類別分開 end
// 分出訓練資料和測試資料
if (dataNum < 30) {
traindatas = datas;
testdatas = datas;
} else {
for (int i = 0; i < group.size(); i++) {// 每個group
dItr = datasByGroup.get(i).iterator();
while (dItr.hasNext()) {// 將該group分訓練和測試
Double[] data = dItr.next();
if (traindatas.size() <= testdatas.size() * 2) {
traindatas.add(data);
} else {
testdatas.add(data);
}
}
}
}
// 分出訓練資料和測試資料 end
}
// 繪圖
public void draw(ScatterChart<Number, Number> sc, LinkedList<Double[]> datas) {
XYChart.Series series[] = new XYChart.Series[group.size()];
for (int i = 0; i < group.size(); i++) {
series[i] = new XYChart.Series();
series[i].setName(Integer.toString(groupArray[i]));
}
// 把所有資料依種類存入Series
Iterator<Double[]> itr = datas.iterator();
while (itr.hasNext()) {
Double[]data = itr.next();
for (int i = 0; i < group.size(); i++) {
if (groupArray[i] == data[dataSize - 1].intValue()) {
series[i].getData().add(new XYChart.Data(data[0], data[1]));
break;
}
}
}
for (int i = 0; i < group.size(); i++) {
sc.getData().add(series[i]);
}
}
LinkedList<Double[]> datasClone(LinkedList<Double[]> a) {
LinkedList<Double[]> b = new LinkedList<Double[]>();
Iterator<Double[]> itr =a.iterator();
while(itr.hasNext()) {
Double[] x =itr.next();
Double[] y =new Double[x.length];
for(int i=0;i<x.length;i++) {
y[i]=x[i];
}
b.add(y);
}
return b;
}
}