第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
以下では、
- 元データをランダムに並べ替える。
- それぞれのクラスを20%のテストデータと80%の学習データに分割する。
- 学習データにおいてxとyの平均値を計算する。
- 平均値とテストデータそれぞれのユークリッド距離を計算し、ユークリッド距離が近い方を予測結果として保存する。
- 正確度を算出する。
を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>]