2024-11-20 07:26:21 +03:00
|
|
|
|
import numpy as np
|
|
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
import pandas as pd
|
|
|
|
|
import matplotlib
|
|
|
|
|
|
|
|
|
|
class lab6:
|
|
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def main(self):
|
|
|
|
|
|
|
|
|
|
matplotlib.use('TkAgg')
|
|
|
|
|
|
|
|
|
|
#создание массивов
|
|
|
|
|
g1 = [[0.7, 0.3, 1.2],
|
|
|
|
|
[0.5, 0.7, 1.0],
|
|
|
|
|
[0.4, 1.0, 0.4],
|
|
|
|
|
[0.7, 0.7, 1.0],
|
|
|
|
|
[0.6, 0.6, 1.5],
|
|
|
|
|
[0.6, 0.6, 1.2],
|
|
|
|
|
[0.6, 0.5, 1.0],
|
|
|
|
|
[0.4, 0.9, 0.6],
|
|
|
|
|
[0.5, 0.6, 1.1],
|
|
|
|
|
[0.8, 0.3, 1.2]]
|
|
|
|
|
g2 = [[0.4, 0.2, 0.8],
|
|
|
|
|
[0.2, 0.2, 0.7],
|
|
|
|
|
[0.9, 0.3, 0.5],
|
|
|
|
|
[0.8, 0.3, 0.6],
|
|
|
|
|
[0.5, 0.6, 0.4],
|
|
|
|
|
[0.6, 0.5, 0.7],
|
|
|
|
|
[0.4, 0.4, 1.2],
|
|
|
|
|
[0.6, 0.3, 1.0],
|
|
|
|
|
[0.3, 0.2, 0.6],
|
|
|
|
|
[0.5, 0.5, 0.8]]
|
|
|
|
|
# Создание датафреймов
|
|
|
|
|
df_g1 = pd.DataFrame(g1, columns=['X1', 'Y1', 'Z1'])
|
|
|
|
|
df_g2 = pd.DataFrame(g2, columns=['X2', 'Y2', 'Z2'])
|
|
|
|
|
# Объединение датафреймов
|
|
|
|
|
df = pd.concat([df_g1, df_g2], axis=1)
|
|
|
|
|
# п3: построение скаттерограммы
|
|
|
|
|
fig = plt.figure()
|
|
|
|
|
ax = fig.add_subplot(111, projection='3d')
|
|
|
|
|
# Наносим точки на график
|
|
|
|
|
ax.scatter(df.iloc[:, 0],
|
|
|
|
|
df.iloc[:, 1],
|
|
|
|
|
df.iloc[:, 2],
|
|
|
|
|
color='midnightblue')
|
|
|
|
|
ax.scatter(df.iloc[:, 3],
|
|
|
|
|
df.iloc[:, 4],
|
|
|
|
|
df.iloc[:, 5],
|
|
|
|
|
color='darkred')
|
|
|
|
|
ax.set_xlabel('1 признак')
|
|
|
|
|
ax.set_ylabel('2 признак')
|
|
|
|
|
ax.set_zlabel('3 признак')
|
|
|
|
|
plt.legend(['g1', 'g2'])
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
# п2: последовательное обучение с коррекцией ошибки
|
|
|
|
|
one = np.ones((10, 1))
|
|
|
|
|
g1 = np.hstack((g1, one))
|
|
|
|
|
g2 = np.hstack((g2, one))
|
|
|
|
|
g2 = (-1)*np.array(g2)
|
|
|
|
|
g = np.vstack((g1, g2))
|
|
|
|
|
W = np.mean(g1, axis=0) - np.mean(g2, axis=0)
|
|
|
|
|
w = W/np.linalg.norm(W)
|
|
|
|
|
proj1=np.matmul(g,w)
|
|
|
|
|
print (proj1)
|
|
|
|
|
plt.figure(3)
|
|
|
|
|
plt.subplot(1, 2, 1)
|
|
|
|
|
plt.hist(proj1.T[0:9], bins= 10,color = ('firebrick'), alpha=0.7, edgecolor = 'black',label='g1')
|
|
|
|
|
plt.hist((-1)*proj1.T[10:19], bins= 10,color = ('indigo'), alpha=0.7, edgecolor ='black',label='g2')
|
|
|
|
|
plt.legend()
|
|
|
|
|
plt.xlabel('Значение')
|
|
|
|
|
plt.ylabel('Количество')
|
|
|
|
|
plt.title('Гистограмма первого приближения')
|
|
|
|
|
learn_coeff = 0.1
|
|
|
|
|
while min(proj1)<0:
|
|
|
|
|
for ind, data_sample in enumerate(g):
|
|
|
|
|
proj1[ind] = np.matmul(data_sample, w)
|
|
|
|
|
if proj1[ind]<0:
|
|
|
|
|
w = w + data_sample*learn_coeff
|
|
|
|
|
proj = np.matmul(g, w)
|
|
|
|
|
v1 = np.matmul(g, w)
|
|
|
|
|
# Построение гистограммы проекций
|
|
|
|
|
plt.subplot(1, 2, 2)
|
|
|
|
|
plt.hist(v1.T[0:9], bins= 10,color = ('firebrick'), alpha=0.7, edgecolor = 'black',label='g1')
|
|
|
|
|
plt.hist((-1)*v1.T[10:19], bins= 10,color = ('indigo'), alpha=0.7, edgecolor ='black',label='g2')
|
|
|
|
|
plt.xlabel('Значение')
|
|
|
|
|
plt.ylabel('Количество')
|
|
|
|
|
plt.title('Гистограмма после обучения')
|
|
|
|
|
plt.legend()
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
l6 = lab6()
|
|
|
|
|
l6.main()
|