Reconnaissance de formes et apprentissage automatique, la "méthode non paramétrique 2.5.2" sera implémentée à partir du chapitre 2.
Une méthode pour saisir la distribution de probabilité en comptant le nombre de données extraites est introduite. J'ai senti que ce chapitre ne pouvait pas être aidé même s'il prenait beaucoup de temps, donc je l'ai mis en œuvre rapidement. Je n'ai pas non plus égratigné la méthode de densité du noyau et j'ai utilisé le package scipy pour tricher.
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
from scipy import stats
from scipy.stats.kde import gaussian_kde
import random
def mix_G(x):
return (0.4 * G1 + 0.6 * G2)
def mix_G_distribution(n):
ratio = 0.3
if random.random() <ratio:
return random.gauss(M1, S1)
else:
return random.gauss(M2, S2)
if __name__ == "__main__":
x = np.linspace(0, 1, 100)
# Set normal distribution1
M1 = 0.3
S1 = 0.15
G1 = stats.norm.pdf(x, M1, S1)
# Set normal distribution1
M2 = 0.75
S2 = 0.1
G2 = stats.norm.pdf(x, M2, S2)
N = 50
Data = [mix_G_distribution(n) for n in range(N)]
plt.subplot(3, 1, 1)
plt.hist(Data, bins=1/0.04, normed=True)
plt.plot(x, mix_G(x), "g-")
plt.xlim(0, 1)
plt.ylim(0, 3)
title("Figure 2.24")
plt.subplot(3, 1, 2)
plt.hist(Data, bins=1/0.08, normed=True)
plt.plot(x, mix_G(x), "g-")
plt.xlim(0, 1)
plt.ylim(0, 3)
plt.subplot(3, 1, 3)
plt.hist(Data, bins=1/0.25, normed=True)
plt.plot(x, mix_G(x), "g-")
plt.xlim(0, 1)
plt.ylim(0, 3)
if __name__ == "__main__":
#Karnel density estimation
from scipy.stats.kde import gaussian_kde
plt.subplot(3, 1, 1)
plt.plot(x, gaussian_kde(Data, 0.005)(x))
plt.plot(x, mix_G(x), "g-")
plt.xlim(0, 1)
plt.ylim(0, 3)
title("Figure 2.25")
plt.subplot(3, 1, 2)
plt.plot(x, gaussian_kde(Data, 0.07)(x))
plt.plot(x, mix_G(x), "g-")
plt.xlim(0, 1)
plt.ylim(0, 3)
plt.subplot(3, 1, 3)
plt.plot(x, gaussian_kde(Data, 0.2)(x))
plt.plot(x, mix_G(x), "g-")
plt.xlim(0, 1)
plt.ylim(0, 3)
#k_Neighbourhood
def k_NN(test, train, k):
train = np.array(train)
train.sort()
r = []
for i in test:
distance = abs(train - i)
distance.sort()
r.append(distance[(k-1)])
r = np.array(r)
return k / (2* r * N)
if __name__ == "__main__":
title("Figure 2.26")
plt.subplot(3, 1, 1)
plt.plot(x, k_NN(x, Data, 1))
plt.plot(x, mix_G(x), "g-")
plt.xlim(0, 1)
plt.ylim(0, 3)
plt.subplot(3, 1, 2)
plt.plot(x, k_NN(x, Data, 10))
plt.plot(x, mix_G(x), "g-")
plt.xlim(0, 1)
plt.ylim(0, 3)
plt.subplot(3, 1, 3)
plt.plot(x, k_NN(x, Data, 30))
plt.plot(x, mix_G(x), "g-")
plt.xlim(0, 1)
plt.ylim(0, 3)
Recommended Posts