Menu
CoddyTech

Skor Silhouette

Termasuk bagian Pembelajaran Tanpa Pengawasan dalam perjalanan Machine Learning di Coddy. Pelajaran 8 dari 51.

Inersia selalu membaik seiring bertambahnya k, jadi dibutuhkan titik siku. Silhouette mengajukan pertanyaan yang lebih adil kepada setiap titik: apakah titik ini lebih dekat dengan kelompoknya sendiri daripada dengan kelompok berikutnya?

Sebuah titik hitam dengan garis utuh ke 8 titik dalam kelompoknya sendiri, panjang rata-rata a = 1.3, dan garis putus-putus ke 8 titik dalam kelompok lain terdekat, panjang rata-rata b = 3.4. Nilai silhouette-nya 0.62

Sebuah titik mendapat skor (b - a) / max(a, b): mendekati 1 jika cocok dalam kelompoknya, mendekati 0 jika berada di perbatasan, di bawah 0 jika berada di kelompok yang salah. Rata-rata skor untuk sebuah pengelompokan:

from sklearn.metrics import silhouette_score
for k in [2, 3, 4]:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(X)
    print(k, f"{silhouette_score(X, km.labels_):.3f}")

Untuk apel, ini mencetak:

2 0.534
3 0.657
4 0.545

Nilainya mencapai puncak pada k terbaik, yaitu 3, saat titik-titik terasa paling cocok.

challenge icon

Tantangan

Mudah

Dua peramal berbeda pendapat tentang jumlah jenis badai yang melanda pesisir mereka. Kode awal berisi 150 badai, angin puncak dan curah hujan, serta membaca k milik Ana, lalu milik Ben.

  1. Beri skor silhouette untuk setiap k, hingga 3 angka desimal.
  2. Cetak k siapa yang lebih cocok.
  3. Cetak k terbaik dari 2 hingga 8, beserta skornya.

Untuk pesisir lain:

Ana, k = 2: 0.512
Ben, k = 3: 0.574
Ben's k fits better
Best from 2 to 8: k = 3 (0.574)

Coba sendiri

import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# Jangan ubah baris-baris di bawah ini
rng = np.random.default_rng(6)
# Empat jenis badai: angin dan hujan yang umum, serta jumlah masing-masing
kinds = [(30, 8, 40), (12, 34, 35), (21, 21, 30), (11, 9, 45)]
parts = []
for w, r, n in kinds:
    parts.append(np.column_stack([rng.normal(w, 2.5, n), rng.normal(r, 3, n)]))
# 150 badai di satu pesisir, masing-masing satu baris: kecepatan angin puncak (m/s) dan curah hujan (mm per jam)
storms = np.round(np.concatenate(parts), 1)

# Jumlah jenis badai menurut kedua peramal cuaca
k_ana = int(input())
k_ben = int(input())

# Tulis kodemu di bawah ini
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pembelajaran Tanpa Pengawasan

Latihan sendiri: Compiler Python online