forked from VladimirAndropov/machine_learning
-
Notifications
You must be signed in to change notification settings - Fork 0
/
machine_learning_17.py
52 lines (40 loc) · 1.79 KB
/
machine_learning_17.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# Гауссовский байесовский классификатор
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1)
# исходные параметры распределений двух классов
r1 = 0.8
D1 = 1.0
mean1 = [0, -3]
V1 = [[D1, D1 * r1], [D1 * r1, D1]]
r2 = 0.7
D2 = 2.0
mean2 = [0, 3]
V2 = [[D2, D2 * r2], [D2 * r2, D2]]
# моделирование обучающей выборки
N = 1000
x1 = np.random.multivariate_normal(mean1, V1, N).T
x2 = np.random.multivariate_normal(mean2, V2, N).T
# вычисление оценок МО и ковариационных матриц
mm1 = np.mean(x1.T, axis=0)
mm2 = np.mean(x2.T, axis=0)
a = (x1.T - mm1).T
VV1 = np.array([[np.dot(a[0], a[0]) / N, np.dot(a[0], a[1]) / N],
[np.dot(a[1], a[0]) / N, np.dot(a[1], a[1]) / N]])
a = (x2.T - mm2).T
VV2 = np.array([[np.dot(a[0], a[0]) / N, np.dot(a[0], a[1]) / N],
[np.dot(a[1], a[0]) / N, np.dot(a[1], a[1]) / N]])
# модель гауссовского байесовского классификатора
Py1, L1 = 0.5, 1 # вероятности появления классов
Py2, L2 = 1 - Py1, 1 # и величины штрафов неверной классификации
b = lambda x, v, m, l, py: np.log(l * py) - 0.5 * (x - m) @ np.linalg.inv(v) @ (x - m).T - 0.5 * np.log(
np.linalg.det(v))
x = np.array([0, -4]) # входной вектор в формате (x, y)
a = np.argmax([b(x, VV1, mm1, L1, Py1), b(x, VV2, mm2, L2, Py2)]) # классификатор
print(a)
# вывод графиков
plt.figure(figsize=(4, 4))
plt.title(f"Корреляции: r1 = {r1}, r2 = {r2}")
plt.scatter(x1[0], x1[1], s=10)
plt.scatter(x2[0], x2[1], s=10)
plt.show()