Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from sklearn.datasets import load_iris
- import numpy as np
- import random
- import matplotlib.pyplot as plt
- from math import sqrt
- # константы
- IRIS = load_iris()
- FEATURES_COUNT = IRIS.data.shape[1]
- DATA_SIZE = IRIS.data.shape[0]
- CLASS_COUNT = IRIS.target_names.shape[0]
- def Distance(p1, p2):
- s = 0
- for i in range(FEATURES_COUNT):
- s += (p2[i] - p1[i]) ** 2
- return sqrt(s)
- # x - искомая точка, p - вторая точка, mx - k+1-я точка по расстоянию
- def Kernel(x, p, mx):
- r = Distance(x, p)
- r2 = Distance(x, mx)
- z = r / r2
- if z >= 1:
- return 0
- else:
- core = 3/4*(1 - z**2)
- return core
- # xD - фичи, yD - метки классов, x1 - неизвестный цветок класс которого нужно угадать, k - кол-во соседей
- def Predict(x1, xD, yD, k):
- L = list()
- for i in range(DATA_SIZE - 1):
- L.append(i)
- L.sort(key = lambda i: Distance(xD[i], x1)) # сортируем по расстоянию индексы
- K = np.zeros(CLASS_COUNT)
- for i in range(k):
- K[int(yD[L[i]])] += Kernel(x1, xD[L[i]], xD[L[k]])
- mx_K = max(K)
- for i in range(CLASS_COUNT):
- if K[i] == mx_K:
- return i
- # Нахождение количества ошибок на 150 тестах
- def LOO(k,X,Y):
- cnt = 0
- for i in range(DATA_SIZE-1):
- x1 = X[i]
- y1 = Y[i]
- xD = np.delete(X, i, axis = 0)
- yD = np.delete(Y, i, axis = 0)
- if Predict(x1, xD, yD, k) != y1:
- cnt += 1
- return cnt
- K = 40
- X = IRIS.data
- Y = IRIS.target
- a, b = np.zeros(K), np.zeros(K)
- for k in range(1, K + 1):
- a[k - 1] = k
- b[k - 1] = LOO(k,X,Y)
- plt.xlabel("Кол-во соседей")
- plt.ylabel("Кол-во ошибок на 150 тестах")
- plt.plot(a, b)
- best = min(b)
- print("Наилучшие K:")
- for i in range(K):
- if b[i] == best:
- print(a[i])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement