Menu
CoddyTech

K-Means'i Elle Uygulama

Coddy'nin Machine Learning Journey'sinin Denetimsiz Öğrenme bölümünün bir parçası. Ders 3 / 51.

K-means, k kümeyi bulmak için iki adımdan oluşan bir turu tekrarlar. Ata: her nokta en yakın merkeze katılır. Taşı: her merkez, noktalarının ortalamasına gider. Üç dondurma arabası:

Bir plajda üç kalabalık hâlinde, sol, orta ve sağda 150 havlu. Üç araba ortanın yakınında birbirine yakın başlar; siyah çizgiler her arabanın tur tur kendi kalabalığının ortasındaki bir yıldıza giden yolunu izler

NumPy'de, dists her merkez için bir sütun içeren bir uzaklık tablosuyken bir tur:

labels = dists.argmin(axis=1)  # ata
for c in range(k):
    centers[c] = X[labels == c].mean(axis=0)  # taşı

argmin(axis=1) her satırın en küçük sütununu verir: en yakın merkezi. Tur üstüne tur merkezler yerleşir; hiçbiri hareket etmediğinde k-means tamamlanır.

challenge icon

Görev

Kolay

Bir tişört üreticisi, S, M ve L bedenlerini bugünün müşterilerine göre yeniden düzenliyor. Eski beden tablosu merkezleri başlatıyor, distances(people, centers) uzaklık tablosunu veriyor ve program çalıştırılacak tur sayısını okuyor.

  1. Her turda: herkesi ata, ardından her merkezi hareket ettir.
  2. Aşağıda gösterildiği gibi, her bedenin merkezini ve son turda o bedeni alan kişi sayısını yazdır.

Başka bir üretici için:

Rounds run: 2
S: chest 87.3 cm, length 65.1 cm, 14 people
M: chest 95.0 cm, length 68.9 cm, 31 people
L: chest 104.8 cm, length 72.6 cm, 45 people

Kendin dene

import numpy as np

# Aşağıdaki satırları değiştirmeyin
rng = np.random.default_rng(12)
chest = np.concatenate([rng.normal(88, 3, 30), rng.normal(98, 3.5, 35), rng.normal(110, 4, 25)])
length = np.concatenate([rng.normal(66, 1.8, 30), rng.normal(70, 2, 35), rng.normal(75, 2.2, 25)])
# 90 müşteri, her biri için bir satır: göğüs çevresi ve uzunluk cm cinsinden
people = np.round(np.column_stack([chest, length]), 1)

# Eski beden tablosu merkezleri başlangıç değerlerine ayarlar: S, M, L
sizes = ["S", "M", "L"]
centers = np.array([[85.0, 64.0], [90.0, 67.0], [96.0, 69.0]])
rounds = int(input())


# Mesafe tablosu: kişi başına bir satır, merkez başına bir sütun
def distances(X, centers):
    table = np.zeros((len(X), len(centers)))
    for c in range(len(centers)):
        table[:, c] = np.sqrt(((X - centers[c]) ** 2).sum(axis=1))
    return table


# Kodunuzu aşağıya yazın
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Denetimsiz Öğrenme bölümündeki tüm dersler

Kendi başına pratik yap: Online Python derleyicisi