質問編集履歴

1

時系列データに対するk近傍法のソースコードの追記

2020/11/09 05:18

投稿

AI_engineer
AI_engineer

スコア15

test CHANGED
File without changes
test CHANGED
@@ -39,3 +39,183 @@
39
39
  ### 補足情報(FW/ツールのバージョンなど)
40
40
 
41
41
  Pythonを使って実装しています。
42
+
43
+
44
+
45
+ ```python
46
+
47
+ import pandas as pd
48
+
49
+ import numpy as np
50
+
51
+ import matplotlib.pyplot as plt
52
+
53
+ from sklearn.neighbors import NearestNeighbors
54
+
55
+
56
+
57
+
58
+
59
+ '''
60
+
61
+ dataをsize毎のスライス窓に分割
62
+
63
+ '''
64
+
65
+
66
+
67
+ def main():
68
+
69
+ df = pd.read_csv("20191121.csv")
70
+
71
+
72
+
73
+ # 余分なデータをDataFrameから削除
74
+
75
+ df = df.drop(['name', 'x_rad/s', 'y_rad/s', 'z_rad/s'], axis=1)
76
+
77
+
78
+
79
+ df = df.set_index('time')
80
+
81
+
82
+
83
+ #x, y, z軸加速度を視認化
84
+
85
+ df.plot().legend(loc='upper left')
86
+
87
+
88
+
89
+ # 前から2480件のx軸加速度を学習データ、その次の2479件をテストデータとする
90
+
91
+ # # df.iloc[2479] ---> 53845130
92
+
93
+ # df.iloc[2480] ---> 53845150
94
+
95
+ train_data = df.loc[:53845130, 'x_ags']
96
+
97
+ test_data = df.loc[53845150:, 'x_ags'].reset_index(drop=True)
98
+
99
+
100
+
101
+ # 窓幅
102
+
103
+ width = 30
104
+
105
+
106
+
107
+ # k近傍法のk
108
+
109
+ nk = 1
110
+
111
+
112
+
113
+ # 窓幅を使ってベクトルの集合を作成
114
+
115
+ train = embed(train_data, width)
116
+
117
+ test = embed(test_data, width)
118
+
119
+
120
+
121
+ # k近傍法でクラスタリング
122
+
123
+ neigh = NearestNeighbors(n_neighbors=nk)
124
+
125
+ neigh.fit(train)
126
+
127
+
128
+
129
+ # 距離を計算
130
+
131
+ d = neigh.kneighbors(test)[0]
132
+
133
+
134
+
135
+ # 距離の正規化
136
+
137
+ mx = np.max(d)
138
+
139
+ d = d / mx
140
+
141
+
142
+
143
+ # 訓練データ
144
+
145
+ plt.subplot(221)
146
+
147
+ plt.plot(train_data, label='Training')
148
+
149
+ plt.xlabel("Amplitude", fontsize=12)
150
+
151
+ plt.ylabel("Sample", fontsize=12)
152
+
153
+ plt.grid()
154
+
155
+ leg = plt.legend(loc=1, fontsize=15)
156
+
157
+ leg.get_frame().set_alpha(1)
158
+
159
+
160
+
161
+ # 異常度
162
+
163
+ plt.subplot(222)
164
+
165
+ plt.plot(d, label='d')
166
+
167
+ plt.xlabel("Amplitude", fontsize=12)
168
+
169
+ plt.ylabel("Sample", fontsize=12)
170
+
171
+ plt.grid()
172
+
173
+ leg = plt.legend(loc=1, fontsize=15)
174
+
175
+ leg.get_frame().set_alpha(1)
176
+
177
+
178
+
179
+ # 検証用データ
180
+
181
+ plt.subplot(223)
182
+
183
+ plt.plot(test_data, label='Test')
184
+
185
+ plt.xlabel("Amplitude", fontsize=12)
186
+
187
+ plt.ylabel("Sample", fontsize=12)
188
+
189
+ plt.grid()
190
+
191
+ leg = plt.legend(loc=1, fontsize=15)
192
+
193
+ leg.get_frame().set_alpha(1)
194
+
195
+
196
+
197
+
198
+
199
+ def embed(lst, dim):
200
+
201
+ emb = np.empty((0, dim), float)
202
+
203
+ for i in range(lst.size - dim + 1):
204
+
205
+ tmp = np.array(lst[i:i+dim])[::-1].reshape((1, -1))
206
+
207
+ emb = np.append(emb, tmp, axis=0)
208
+
209
+ return emb
210
+
211
+
212
+
213
+ if __name__ == '__main__':
214
+
215
+ main()
216
+
217
+ ```
218
+
219
+
220
+
221
+ ![左上:訓練データ,左下:テストデータ,右上:異常度](15d9983fb3b40aded89010e0bc082414.png)