Advertisement
Kono_Irridan_Da

Первая лаба

Oct 16th, 2020 (edited)
2,256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. from sklearn.datasets import load_iris
  2. import numpy as np
  3. import random
  4. import matplotlib.pyplot as plt
  5. from math import sqrt
  6.  
  7. # константы
  8. IRIS = load_iris()
  9. FEATURES_COUNT = IRIS.data.shape[1]
  10. DATA_SIZE = IRIS.data.shape[0]
  11. CLASS_COUNT = IRIS.target_names.shape[0]
  12.  
  13. def Distance(p1, p2):
  14.     s = 0
  15.     for i in range(FEATURES_COUNT):
  16.         s += (p2[i] - p1[i]) ** 2
  17.     return sqrt(s)
  18.  
  19. # x - искомая точка, p - вторая точка, mx - k+1-я точка по расстоянию
  20. def Kernel(x, p, mx):
  21.     r = Distance(x, p)
  22.     r2 = Distance(x, mx)
  23.     z = r / r2
  24.     if z >= 1:
  25.         return 0
  26.     else:
  27.         core = 3/4*(1 - z**2)
  28.         return core
  29.  
  30. # xD - фичи, yD - метки классов, x1 - неизвестный цветок класс которого нужно угадать, k - кол-во соседей
  31. def Predict(x1, xD, yD, k):
  32.     L = list()
  33.     for i in range(DATA_SIZE - 1):
  34.         L.append(i)
  35.     L.sort(key = lambda i: Distance(xD[i], x1)) # сортируем по расстоянию индексы
  36.    
  37.    
  38.     K = np.zeros(CLASS_COUNT)
  39.     for i in range(k):
  40.        
  41.         K[int(yD[L[i]])] += Kernel(x1, xD[L[i]], xD[L[k]])
  42.            
  43.     mx_K = max(K)
  44.     for i in range(CLASS_COUNT):
  45.         if K[i] == mx_K:
  46.             return i
  47.  
  48. # Нахождение количества ошибок на 150 тестах
  49. def LOO(k,X,Y):
  50.     cnt = 0
  51.     for i in range(DATA_SIZE-1):
  52.         x1 = X[i]
  53.         y1 = Y[i]
  54.         xD = np.delete(X, i, axis = 0)
  55.         yD = np.delete(Y, i, axis = 0)
  56.         if Predict(x1, xD, yD, k) != y1:
  57.             cnt += 1
  58.     return cnt
  59.  
  60. K = 40
  61. X = IRIS.data
  62. Y = IRIS.target
  63. a, b = np.zeros(K), np.zeros(K)
  64. for k in range(1, K + 1):
  65.     a[k - 1] = k
  66.     b[k - 1] = LOO(k,X,Y)
  67. plt.xlabel("Кол-во соседей")
  68. plt.ylabel("Кол-во ошибок на 150 тестах")
  69. plt.plot(a, b)
  70. best = min(b)
  71. print("Наилучшие K:")
  72. for i in range(K):
  73.     if b[i] == best:
  74.         print(a[i])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement