内容
###・k近傍法とは
###・pythonでの実装
#目標
###・正しさより、イメージしやすさ重視での理論の説明
###・可視化するために二次元データで実装
#k近傍法とは
###ざっくりいうと・・・
####データの集まりのうち、異常度を調べたいデータをpとする。
####pを中心とする円を考える。円を少しずつ大きくしていき、円に含まれる点の数がk個になったらその時の半径をεとする。
####これがk近傍法の基本的な考え方。
####pが正常なデータの集まりから離れているとき、kは小さくなり、pの周りに正常なデータが多く存在するとき、kは大きくなる。
####kを決めてデータを含むpを中心とする円の半径の最小値εの大きさで異常度を判定してもよい←今回はこれ
###局所外れ値や、多クラスなどの機械学習に使われるk近傍法の応用的な理論はもう少し複雑ですが、とりあえず簡単な理論で実装しましょう。
#pythonでの実装
##環境
###・python3.6
###・windows10
##データの生成
####numpy の乱数で二次元データを作成
####このまとまりから外れているデータを識別したい。
####先ほどの原理をそのままコードにする。
class KNN2d:
def knn2d(self, x, y, k):
num = x.shape[0]
ipsilon_list = []
for j in range(num):
l_list = [] #k番目のデータに対するその他のデータの距離
for i in range(num):
xl = x[i] - x[j]
yl = y[i] - y[j]
l2 = (xl) ** 2 + (yl) ** 2
l = l2 ** 0.5
l_list.append(l)
l_li = np.array(l_list)
l_li = np.sort(l_li)
ipsilon_list.append(l_li[k])
abnormals = np.array(ipsilon_list)
return abnormals/10
def abnormal_decision(self, abnormals, treshold):
result_list = []
num = abnormals.shape[0]
for i in range(num):
abnormal = abnormals[i]
if abnormal > treshold:
result_list.append(i)
return result_list
####離れたところにあるプロットをおおむね識別できた。
####閾値εを手動で設定しないといけないなど、実用するには改良しないとだけど、イメージはつかめた。