Menu
CoddyTech

Klastry jako cechy

Część sekcji Uczenie nienadzorowane ścieżki Machine Learning w Coddy. Lekcja 40 z 51.

Model o przebiegu liniowym nie może się zakrzywiać. Sygnał telefoniczny w trzech wsiach słabnie wraz z odległością od masztu w każdej z nich — zależności, której nie da się uchwycić samym położeniem:

135 domów w trzech wsiach, wschód w prawo, północ w górę, każda wieś skupiona wokół czarnego krzyżyka, jej środka k-means. Przerywane linie łączą jeden czerwony dom ze wszystkimi trzema środkami: 4.9 km, 5.2 km, a najbliższy — 1.0 km

k-średnich znajduje wioski. km.transform podaje odległość każdego wiersza od każdego środka, a .min(axis=1) zachowuje najbliższy:

km = KMeans(n_clusters=3, n_init=10, random_state=0).fit(X_train)
near_train = km.transform(X_train).min(axis=1)
near_test = km.transform(X_test).min(axis=1)
X_train2 = np.column_stack([X_train, near_train])
X_test2 = np.column_stack([X_test, near_test])

Dzięki tej jednej dodatkowej kolumnie współczynnik determinacji R² modelu liniowego w zbiorze testowym wzrasta z 0.000 do 0.886.

Dopasuj k-means tylko do wierszy treningowych, tak jak skaler, a następnie przekształć oba zbiory.

challenge icon

Wyzwanie

Średni

Zespół nagłośnienia festiwalu chce wiedzieć, jak głośno jest w miejscach, w których stoją ludzie. Kod początkowy dzieli dane z crowd.csv, odczytuje k i wyświetla wynik uzyskany wyłącznie na podstawie pozycji.

  1. Dopasuj k-średnich z k klastrami do pozycji w zbiorze treningowym.
  2. Dodaj odległość każdego wiersza od najbliższego środka jako trzecią kolumnę w obu zbiorach.
  3. Wyświetl nowe R kwadrat dla zbioru testowego oraz przyrost, z dokładnością do 3 miejsc po przecinku.

Dla innego festiwalu i k = 4:

Position only: R squared 0.097
With the nearest of 4 centers: R squared 0.734
Gain: 0.637

Spróbuj swoich sił

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.cluster import KMeans

# 250 uczestników festiwalu: gdzie stali (m) i jaki był tam poziom dźwięku (dB)
crowd = pd.read_csv("crowd.csv")
X = crowd[["x_m", "y_m"]].to_numpy()
y = crowd["sound_db"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
k = int(input())


# Dopasowuje regresję liniową do kolumn treningowych i zwraca jej R kwadrat dla kolumn testowych
def test_r2(A_train, A_test):
    model = LinearRegression().fit(A_train, y_train)
    return model.score(A_test, y_test)


before = test_r2(X_train, X_test)
print(f"Position only: R squared {before:.3f}")

# Napisz swój kod poniżej
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Uczenie nienadzorowane

Poćwicz samodzielnie: Kompilator Python online