15.1. Wyszukiwanie najbliższych sąsiadów obserwacji

# Wczytanie bibliotek.
from sklearn import datasets
from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import StandardScaler

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data

# Utworzenie egzemplarza StandardScaler.
standardizer = StandardScaler()

# Standaryzacja cech.
features_standardized = standardizer.fit_transform(features)

# Dwóch najbliższych sąsiadów.
nearest_neighbors = NearestNeighbors(n_neighbors=2).fit(features_standardized)

# Utworzenie obserwacji.
new_observation = [ 1,  1,  1,  1]

# Obliczenie odległości i odszukanie indeksów najbliższych sąsiadów obserwacji.
distances, indices = nearest_neighbors.kneighbors([new_observation])

# Wyświetlenie najbliższych sąsiadów.
features_standardized[indices]

array([[[1.03800476, 0.55861082, 1.10378283, 1.18556721],
            [0.79566902, 0.32841405, 0.76275827, 1.05393502]]])





# Wyszukanie dwóch najbliższych sąsiadów na podstawie odległości euklidesowej.
nearestneighbors_euclidean = NearestNeighbors(
    n_neighbors=2, metric='euclidean').fit(features_standardized)
Utworzona zmienna distances zawiera rzeczywisty pomiar 




# Wyświetlenie odległości.
distances

array([[0.49140089, 0.74294782]])





# Wyszukanie trzech najbliższych sąsiadów każdej obserwacji
# na podstawie odległości euklidesowej (włączając także i tę obserwację).
nearestneighbors_euclidean = NearestNeighbors(
    n_neighbors=3, metric="euclidean").fit(features_standardized)

# Lista list wskazujących trzech najbliższych sąsiadów każdej obserwacji
# (włączając także i tę obserwację).
nearest_neighbors_with_self = nearestneighbors_euclidean.kneighbors_graph(
    features_standardized).toarray()

# Usunięcie jedynek oznaczających, że obserwacja jest swoim najbliższym sąsiadem.
for i, x in enumerate(nearest_neighbors_with_self):
    x[i] = 0

# Wyświetlenie dwóch najbliższych sąsiadów pierwszej obserwacji.
nearest_neighbors_with_self[0]

array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])





15.2. Tworzenie klasyfikatora k najbliższych sąsiadów

# Wczytanie bibliotek.
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn import datasets

# Wczytanie danych.
iris = datasets.load_iris()
X = iris.data
y = iris.target

# Utworzenie egzemplarza StandardScaler.
standardizer = StandardScaler()

# Standaryzacja cech.
X_std = standardizer.fit_transform(X)

# Wytrenowanie klasyfikatora KNN wraz z pięcioma najbliższymi sąsiadami.
knn = KNeighborsClassifier(n_neighbors=5, n_jobs=-1).fit(X_std, y)

# Utworzenie dwóch obserwacji.
new_observations = [[ 0.75,  0.75,  0.75,  0.75],
                    [ 1,  1,  1,  1]]

# Prognozowanie klasy tych dwóch obserwacji.
knn.predict(new_observations)

array([1, 2])





# Wyświetlenie prawdopodobieństwa, że każda obserwacja jest jednej z trzech klas.
knn.predict_proba(new_observations)

array([[ 0. ,  0.6,  0.4],
       [ 0. ,  0. ,  1. ]])





knn.predict(new_observations)

array([1, 2])





15.3. Ustalanie najlepszej wielkości sąsiedztwa

# Wczytanie bibliotek.
from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.model_selection import GridSearchCV

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie egzemplarza typu StandardScaler.
standardizer = StandardScaler()

# Utworzenie klasyfikatora KNN.
knn = KNeighborsClassifier(n_neighbors=5, n_jobs=-1)

# Utworzenie egzemplarza typu Pipeline.
pipe = Pipeline([("standardizer", standardizer), ("knn", knn)])

# Przygotowanie przestrzeni dla prognozowanych wartości.
search_space = [{"knn__n_neighbors": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}]

# Zdefiniowanie metody przeszukiwania siatki.
classifier = GridSearchCV(
    pipe, search_space, cv=5, verbose=0).fit(features_standardized, target)





# Najlepsza wielkość sąsiedztwa (k).
classifier.best_estimator_.get_params()["knn__n_neighbors"]

6





15.4. Tworzenie klasyfikatora najbliższych sąsiadów opartego na promieniu

# Wczytanie bibliotek.
from sklearn.neighbors import RadiusNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn import datasets

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie egzemplarza typu StandardScaler.
standardizer = StandardScaler()

# Standaryzacja cech.
features_standardized = standardizer.fit_transform(features)

# Wytrenowanie klasyfikatora sąsiedztwa na podstawie promienia.
rnn = RadiusNeighborsClassifier(
    radius=.5, n_jobs=-1).fit(features_standardized, target)

# Utworzenie dwóch obserwacji.
new_observations = [[ 1,  1,  1,  1]]

# Prognozowanie klasy tych dwóch obserwacji.
rnn.predict(new_observations)

array([2])





15.5. Wyszukiwanie przybliżonych najbliższych sąsiadów

# Wczytanie bibliotek.
import faiss
import numpy as np
from sklearn import datasets
from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import StandardScaler

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data

# Utworzenie egzemplarza typu StandardScaler.
standardizer = StandardScaler()

# Standaryzacja cech.
features_standardized = standardizer.fit_transform(features)

# Zdefiniowanie parametrów faiss.
n_features = features_standardized.shape[1]
nlist = 3
k = 2

# Utworzenie indeksu IVF.
quantizer = faiss.IndexFlatIP(n_features)
index = faiss.IndexIVFFlat(quantizer, n_features, nlist)

# Wytrenowanie indeksu i dodanie wektorów cech.
index.train(features_standardized)
index.add(features_standardized)

# Utworzenie obserwacji.
new_observation = np.array([[ 1,  1,  1,  1]])

# Szukanie indeksu dwóch najbliższych sąsiadów.
distances, indices = index.search(new_observation, k)

# Wyświetlenie wektorów cech dla dwóch najbliższych sąsiadów.
np.array([list(features_standardized[i]) for i in indices[0]])

array([[1.03800476, 0.55861082, 1.10378283, 1.18556721],
       [0.79566902, 0.32841405, 0.76275827, 1.05393502]])





15.6. Ocena przybliżonych najbliższych sąsiadów

# Wczytanie bibliotek.
import faiss
import numpy as np
from sklearn import datasets
from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import StandardScaler

# Liczba najbliższych sąsiadów.
k = 10

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie egzemplarza typu StandardScaler.
standardizer = StandardScaler()

# Standaryzacja cech.
features_standardized = standardizer.fit_transform(features)

# Utworzenie KNN z dziesięcioma najbliższymi sąsiadami.
nearest_neighbors = NearestNeighbors(n_neighbors=k).fit(features_standardized)

# Zdefiniowanie parametrów faiss.
n_features = features_standardized.shape[1]
nlist = 3

# Utworzenie indeksu IVF.
quantizer = faiss.IndexFlatIP(n_features)
index = faiss.IndexIVFFlat(quantizer, n_features, nlist)

# Wytrenowanie indeksu i dodanie wektorów cech.
index.train(features_standardized)
index.add(features_standardized)
index.nprobe = 1

# Utworzenie obserwacji.
new_observation = np.array([[ 1,  1,  1,  1]])

# Obliczenie odległości i odszukanie indeksów najbliższych sąsiadów obserwacji.
knn_distances, knn_indices = nearest_neighbors.kneighbors(new_observation)

# Szukanie indeksu dwóch najbliższych sąsiadów.
ivf_distances, ivf_indices = index.search(new_observation, k)

# Pobranie nałożenia się zbiorów.
recalled_items = set(list(knn_indices[0])) & set(list(ivf_indices[0]))

# Wyświetlenie pełności.
print(f"Pełność @k={k}: {len(recalled_items)/k * 100}%")

Pełność @k=10: 100.0%
