第1回の練習問題の解答例¶

In [1]:
# 使用するライブラリのimport
import numpy as np
import random
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
# データの生成
# X1とY1がFailのデータ
# X2とY2がPassのデータ
np.random.seed(100)
X1 = np.random.normal(7,5,100)
Y1 = np.random.normal(15,5,100)
X2 = np.random.normal(15,5,100)
Y2 = np.random.normal(4,4,100)
In [3]:
# 特徴量xと特徴量yをペアにする
# あとで扱いやすいようにnumpyのarrayにしておく

F = []

for i,j in zip(X1,Y1):
    F.append(np.array([i,j]))
    
P = []

for i,j in zip(X2,Y2):
    P.append(np.array([i,j]))
In [10]:
# 各回の正確度を保存するリスト
Accuracy = []

# テストデータの正解ラベル
# Failを0、Passを1とする
# テストデータはFおよびPからそれぞれ20ずつ取ってくる

L = [0]*20+[1]*20

以下では、

  1. 元データをランダムに並べ替える。
  2. それぞれのクラスを20%のテストデータと80%の学習データに分割する。
  3. 学習データにおいてxとyの平均値を計算する。
  4. 平均値とテストデータそれぞれのユークリッド距離を計算し、ユークリッド距離が近い方を予測結果として保存する。
  5. 正確度を算出する。

を100回繰り返している。結果がAccuracyというリストに保存されている。

In [12]:
for i in range(100):
    # 1. 元データをランダムに並べ替える。
    F2 = random.sample(F,len(F))
    P2 = random.sample(P,len(P))
    
    # 2. それぞれのクラスを20%のテストデータと80%の学習データに分割する。
    
    test_F,train_F = F2[:20],F2[20:]
    test_P,train_P = P2[:20],P2[20:]
    
    # テストデータをまとめる
    N = test_F + test_P
    
    # 3. 学習データにおいてxとyの平均値を計算する。
    x = 0
    y = 0

    for i,j in train_F:
        x += i
        y += j
    
    F_ave = np.array([x/80,y/80])

    x = 0
    y = 0

    for i,j in train_P:
        x += i
        y += j
    
    P_ave = np.array([x/80,y/80])
    
    
    # 4. 平均値とテストデータそれぞれのユークリッド距離を計算し、ユークリッド距離が近い方を予測結果として保存する。
    
    y_pred = []
    
    for i in N:
        f = np.linalg.norm(F_ave - i)
        p = np.linalg.norm(P_ave - i)
        if p < f:
            y_pred.append(1)
        else:
            y_pred.append(0)
            
    # 5. 正確度を算出する。
    A = []
    
    for i,j in zip(L,y_pred):
        if i == j:
            A.append(1)
        else:
            A.append(0)
    
    # 正確度を計算して保存
    Accuracy.append(sum(A)/40)
    

各回の正確度

In [14]:
x = np.arange(1,101)
plt.plot(x,Accuracy)
Out[14]:
[<matplotlib.lines.Line2D at 0x1280902e0>]
No description has been provided for this image