Python ve Scikit-Learn PlatoBlockchain Veri Zekası ile Hiyerarşik Kümelemeye İlişkin Kesin Kılavuz. Dikey Arama. Ai.

Python ve Scikit-Learn ile Hiyerarşik Kümeleme için Kesin Kılavuz

Giriş

Bu kılavuzda, aşağıdakileri uygulamaya odaklanacağız: Scikit-Learn ile Hiyerarşik Kümeleme Algoritması bir pazarlama problemini çözmek için.

Kılavuzu okuduktan sonra anlayacaksınız:

  • Hiyerarşik Kümeleme ne zaman uygulanmalı?
  • Kümelemeye uygun olup olmadığını anlamak için veri kümesi nasıl görselleştirilir
  • Veri kümesine dayalı olarak özelliklerin ön işlemesi ve yeni özelliklerin mühendisliği nasıl yapılır?
  • PCA kullanarak veri kümesinin boyutluluğu nasıl azaltılır
  • Grupları ayırmak için bir dendrogram nasıl kullanılır ve okunur
  • Dendrogramlara ve kümeleme algoritmalarına uygulanan farklı bağlama yöntemleri ve mesafe ölçümleri nelerdir?
  • Aglomeratif ve bölücü kümeleme stratejileri nelerdir ve nasıl çalışırlar?
  • Scikit-Learn ile Toplu Hiyerarşik Kümeleme nasıl uygulanır?
  • Kümeleme algoritmalarıyla uğraşırken en sık karşılaşılan sorunlar nelerdir ve nasıl çözülür?

Not: Bu kılavuzdaki tüm kodları içeren not defterini indirebilirsiniz. okuyun.

Motivasyon

Pazarlama departmanı ile arayüz oluşturan bir veri bilimi ekibinin parçası olduğunuz bir senaryo hayal edin. Pazarlama, bir süredir müşteri alışveriş verilerini topluyor ve toplanan verilere dayanarak, eğer varsa, anlamak istiyorlar. müşteriler arasındaki benzerlikler. Bu benzerlikler müşterileri gruplara ayırır ve müşteri gruplarına sahip olmak kampanyaların, promosyonların, dönüşümlerin hedeflenmesine ve daha iyi müşteri ilişkileri kurulmasına yardımcı olur.

Hangi müşterilerin benzer olduğunu belirlemenize yardımcı olmanın bir yolu var mı? Kaç tanesi aynı gruba ait? Ve kaç farklı grup var?

Bu soruları yanıtlamanın bir yolu, bir kümeleme K-Means, DBSCAN, Hiyerarşik Kümeleme vb. gibi algoritmalar. Genel anlamda, kümeleme algoritmaları veri noktaları arasındaki benzerlikleri bulur ve bunları gruplandırır.

Bu durumda, pazarlama verilerimiz oldukça küçüktür. Sadece 200 müşteri hakkında bilgimiz var. Pazarlama ekibini düşünürsek, onlara küme sayısına göre kararların nasıl alındığını net bir şekilde anlatabilmemiz, dolayısıyla onlara algoritmanın gerçekte nasıl çalıştığını açıklamamız önemlidir.

Verilerimiz küçük olduğundan ve açıklanabilirlik önemli bir faktör olduğundan, kaldıraç yapabiliriz Hiyerarşik kümeleme bu problemi çözmek için. Bu süreç olarak da bilinir Hiyerarşik Kümeleme Analizi (HCA).

HCA'nın avantajlarından biri, yorumlanabilir olması ve küçük veri kümelerinde iyi çalışmasıdır.

Bu senaryoda dikkate alınması gereken başka bir şey de HCA'nın bir denetimsiz algoritma. Verileri gruplandırırken, bir kullanıcının belirli bir gruba ait olduğunu doğru bir şekilde belirlediğimizi doğrulamanın bir yolu olmayacaktır (grupları bilmiyoruz). Sonuçlarımızı karşılaştırabileceğimiz bir etiket yok. Grupları doğru bir şekilde belirlersek, daha sonra pazarlama departmanı tarafından günlük olarak (ROI, dönüşüm oranları vb. metriklerle ölçüldüğü gibi) onaylanacaktır.

Çözmeye çalıştığımız sorunu ve nasıl çözeceğimizi anladığımıza göre artık verilerimize göz atmaya başlayabiliriz!

Kısa Keşif Verileri Analizi

Not: Bu kılavuzda kullanılan veri setini indirebilirsiniz. okuyun.

Veri kümesini indirdikten sonra, bunun bir CSV (virgülle ayrılmış değerler) çağrılan dosya shopping-data.csv. Verileri keşfetmeyi ve değiştirmeyi kolaylaştırmak için, verileri bir DataFrame Pandalar kullanarak:

import pandas as pd


path_to_file = 'home/projects/datasets/shopping-data.csv'
customer_data = pd.read_csv(path_to_file)

Pazarlama, 200 müşteri kaydı topladığını söyledi. İndirilen verilerin 200 satır ile tamamlanıp tamamlanmadığını aşağıdaki komutu kullanarak kontrol edebiliriz. shape bağlanmak. Sırasıyla kaç satır ve sütunumuz olduğunu bize söyleyecektir:

customer_data.shape

Bunun sonucu:

(200, 5)

Harika! Verilerimiz 200 satır ile tamamlandı (müşteri kayıtları) ve ayrıca 5 sütunumuz var (özellikleri). Pazarlama departmanının müşterilerden hangi özellikleri topladığını görmek için sütun adlarını görebiliriz. columns bağlanmak. Bunu yapmak için yürütün:

customer_data.columns

Yukarıdaki komut dosyası şunu döndürür:

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')

Burada, pazarlamanın bir CustomerID, topladı Genre, Age, Annual Income (bin dolar olarak) ve bir Spending Score 1 müşterinin her biri için 100'den 200'e gidiyor. Açıklama istendiğinde, değerlerin Spending Score sütunu, bir kişinin alışveriş merkezinde ne sıklıkta para harcadığını 1'den 100'e kadar gösterir. Diğer bir deyişle, bir müşterinin puanı 0 ise, bu kişi asla para harcamaz ve puan 100 ise, az önce fark ettik. en çok harcayan

Veri setimizde yer alan kullanıcıların harcama alışkanlıklarını incelemek için bu puanın dağılımına hızlıca bir göz atalım. Pandaların olduğu yer hist() yöntem yardımcı olmak için gelir:

customer_data['Spending Score (1-100)'].hist()

img

Histograma baktığımızda 35'ten fazla müşterinin arasında puanlar olduğunu görüyoruz. 40 ve 60, daha sonra 25'ten az puanlar var 70 ve 80. Yani müşterilerimizin çoğu dengeli harcama yapanlar, ardından orta ila yüksek harcama yapanlar. sonrasında bir çizgi olduğunu da görebiliriz. 0, dağıtımın solunda ve 100'den önce başka bir satır, dağıtımın sağında. Bu boşluklar muhtemelen dağılımın harcama yapmayanları içermediği anlamına gelir; 0, ve aynı zamanda yüksek harcama puanına sahip hiç kimse yoktur. 100.

Bunun doğru olup olmadığını doğrulamak için dağılımın minimum ve maksimum değerlerine bakabiliriz. Bu değerler, tanımlayıcı istatistiklerin bir parçası olarak kolayca bulunabilir, böylece describe() diğer sayısal değer dağılımlarını anlama yöntemi:


customer_data.describe().transpose()

Bu bize veri setimizin diğer değerlerinin dağılımlarını okuyabileceğimiz bir tablo verecektir:

 						count 	mean 	std 		min 	25% 	50% 	75% 	max
CustomerID 				200.0 	100.50 	57.879185 	1.0 	50.75 	100.5 	150.25 	200.0
Age 					200.0 	38.85 	13.969007 	18.0 	28.75 	36.0 	49.00 	70.0
Annual Income (k$) 		200.0 	60.56 	26.264721 	15.0 	41.50 	61.5 	78.00 	137.0
Spending Score (1-100) 	200.0 	50.20 	25.823522 	1.0 	34.75 	50.0 	73.00 	99.0

Hipotezimiz doğrulandı. bu min değeri Spending Score is 1 ve maksimum 99. yani bizde yok 0 or 100 puan harcayanlar O zaman transpoze edilen diğer sütunlara bir göz atalım. describe masa. bakıldığında mean ve std sütunlar için bunu görebiliriz Age the mean is 38.85 ve std yaklaşık olarak 13.97. Aynı şey için olur Annual Income, Bir ile mean of 60.56 ve std 26.26, Ve için Spending Score Birlikte mean of 50 ve std of 25.82. Tüm özellikler için, mean gösteren standart sapmadan uzaktır. verilerimiz yüksek değişkenliğe sahiptir.

Verilerimizin nasıl değiştiğini daha iyi anlamak için, Annual Income dağıtım:

customer_data['Annual Income (k$)'].hist()

Hangi bize verecek:

img

Histogramda, 35'ten fazla müşteri olan verilerimizin çoğunun, sayının yakınında toplandığına dikkat edin. 60, bizim üzerimizde mean, yatay eksende. Peki dağıtımın uçlarına doğru ilerledikçe ne olur? Sola doğru gittiğimizde, 60.560 $ ortalamasından, karşılaşacağımız bir sonraki değer 34.300 $ olacaktır – ortalama (60.560 $) eksi standart varyasyon (26.260 $). Veri dağılımımızın soluna doğru daha da uzaklaşırsak, benzer bir kural geçerli olur; standart varyasyonu (26.260$) mevcut değerden (34.300$) çıkarırız. Dolayısıyla 8.040$ değeriyle karşılaşacağız. Verilerimizin nasıl hızla 60 bin dolardan 8 bin dolara çıktığına dikkat edin. Her seferinde 26.260 dolardan “sıçrayıyor”; çok değişkenlik gösteriyor ve bu yüzden bu kadar yüksek değişkenliğe sahibiz.

img

Kümeleme analizinde verilerin değişkenliği ve boyutu önemlidir çünkü çoğu kümeleme algoritmasının mesafe ölçümleri veri büyüklüklerine duyarlıdır. Boyuttaki fark, bir noktanın diğerine gerçekte olduğundan daha yakın veya daha uzak görünmesini sağlayarak, gerçek veri gruplandırmasını bozarak kümeleme sonuçlarını değiştirebilir.

Şimdiye kadar verilerimizin şeklini, bazı dağılımlarını ve tanımlayıcı istatistikleri gördük. Pandalar ile veri türlerimizi de listeleyebilir ve 200 satırımızın tamamının dolu olup olmadığını veya bazılarının dolu olup olmadığını görebiliriz. null değerler:

customer_data.info()

Bunun sonucu:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns):
 #   Column                  Non-Null Count  Dtype 
---  ------                  --------------  ----- 
 0   CustomerID              200 non-null    int64 
 1   Genre                   200 non-null    object
 2   Age                     200 non-null    int64 
 3   Annual Income (k$)      200 non-null    int64 
 4   Spending Score (1-100)  200 non-null    int64 
dtypes: int64(4), object(1)
memory usage: 7.9+ KB

Burada görebiliyoruz ki yok null verilerdeki değerler ve yalnızca bir kategorik sütunumuz var – Genre. Bu aşamada, kümeleme modeline hangi özelliklerin eklenmesi ilginç göründüğünü aklımızda tutmamız önemlidir. Modelimize Tür sütununu eklemek istiyorsak, değerlerini kategorik için sayısal.

Nasıl görelim Genre verilerimizin ilk 5 değerine hızlı bir göz atarak doldurulur:

customer_data.head() 

Bunun sonucu:

    CustomerID 	Genre 	Age 	Annual Income (k$) 	Spending Score (1-100)
0 	1 			Male 	19 		15 					39
1 	2 			Male 	21 		15 					81
2 	3 			Female 	20 		16 					6
3 	4 			Female 	23 		16 					77
4 	5 			Female 	31 		17 					40

Görünüşe göre sadece sahip Female ve Male kategoriler. ile kendine has değerlerine bir göz atarak bundan emin olabiliriz. unique:

customer_data['Genre'].unique()

Bu, varsayımımızı doğrular:

array(['Male', 'Female'], dtype=object)

Şimdiye kadar sadece iki türümüz olduğunu biliyoruz, eğer bu özelliği modelimizde kullanmayı planlıyorsak, Male dönüştürülebilir 0 ve Female için 1. Dengeli olup olmadıklarını görmek için türler arasındaki oranı kontrol etmek de önemlidir. ile yapabiliriz value_counts() yöntem ve argümanı normalize=True arasındaki yüzdeyi göstermek için Male ve Female:

customer_data['Genre'].value_counts(normalize=True)

Bu çıktılar:

Female    0.56
Male      0.44
Name: Genre, dtype: float64

Veri setinde kadınların %56'sı ve erkeklerin %44'ü var. Aralarındaki fark sadece %16 ve verilerimiz 50/50 değil ama yeterince dengeli sorun çıkarmamak için. Sonuçlar 70/30, 60/40 olsaydı, o zaman ya daha fazla veri toplamak ya da bu oranı daha dengeli hale getirmek için bir tür veri artırma tekniği kullanmak gerekebilirdi.

Şimdiye kadar, tüm özellikler ancak Age, kısaca incelenmiştir. hangi endişelerde Age, müşterileri yaş gruplarına göre segmentlere ayırabilmek için kutulara bölmek genellikle ilginçtir. Bunu yaparsak, modelimize eklemeden önce yaş kategorilerini tek bir sayıya dönüştürmemiz gerekir. Bu şekilde 15-20 yıl kategorisini kullanmak yerine, kaç müşteri olduğunu sayarız. 15-20 kategori ve bu, adlı yeni bir sütundaki bir sayı olacaktır. 15-20.

Önerileri: Bu kılavuzda, yalnızca kısa keşif amaçlı veri analizi sunuyoruz. Ama daha ileri gidebilirsin ve daha ileri gitmelisin. Tür ve yaşa göre gelir farklılıkları ve puanlama farklılıkları olup olmadığını görebilirsiniz. Bu sadece analizi zenginleştirmekle kalmaz, aynı zamanda daha iyi model sonuçlarına yol açar. Keşifsel Veri Analizine daha derine inmek için EDA bölümündeki “Uygulamalı Ev Fiyat Tahmini - Python'da Makine Öğrenimi" Rehberli Proje.

Hem kategorik hem de kategorik olmak için neler yapılabileceğine dair tahminlerde bulunduktan sonra Genre ve Age sütunlar, tartışılanları uygulayalım.

Değişkenleri Kodlama ve Özellik Mühendisliği

bölerek başlayalım Age 10'da değişen gruplara ayırıyoruz, böylece 20-30, 30-40, 40-50 vb. En genç müşterimiz 15 olduğundan, verilerdeki en yaşlı müşterinin yaşı olan 15'te başlayıp 70'te bitirebiliriz. 15'ten başlayıp 70'te biten 15-20, 20-30, 30-40, 40-50, 50-60 ve 60-70 aralıklarımız olurdu.

Gruplamak veya çöp kutusu Age bu aralıklara değerler, Pandaları kullanabiliriz cut() onları kutulara ayırma ve ardından kutuları yeni bir Age Groups sütun:

intervals = [15, 20, 30, 40, 50, 60, 70]
col = customer_data['Age']
customer_data['Age Groups'] = pd.cut(x=col, bins=intervals)


customer_data['Age Groups'] 

Bunun sonucu:

0      (15, 20]
1      (20, 30]
2      (15, 20]
3      (20, 30]
4      (30, 40]
         ...   
195    (30, 40]
196    (40, 50]
197    (30, 40]
198    (30, 40]
199    (20, 30]
Name: Age Groups, Length: 200, dtype: category
Categories (6, interval[int64, right]): [(15, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 60] < (60, 70]]

Sütun değerlerine bakarken, 6 kategorimiz olduğunu belirten ve tüm binded veri aralıklarını gösteren bir satır olduğuna dikkat edin. Bu şekilde daha önceki sayısal verilerimizi kategorize ettik ve yeni bir Age Groups özelliği.

Ve her kategoride kaç müşterimiz var? Sütunu gruplayarak ve değerleri ile sayarak hızlı bir şekilde bilebiliriz. groupby() ve count():

customer_data.groupby('Age Groups')['Age Groups'].count()

Bunun sonucu:

Age Groups
(15, 20]    17
(20, 30]    45
(30, 40]    60
(40, 50]    38
(50, 60]    23
(60, 70]    17
Name: Age Groups, dtype: int64

Çoğu müşterinin 30 ila 40 yaşları arasında olduğunu, ardından 20 ila 30 arasındaki müşterilerin ve ardından 40 ila 50 arasındaki müşterilerin olduğunu tespit etmek kolaydır. Bu, Pazarlama departmanı için de iyi bir bilgidir.

Şu anda iki kategorik değişkenimiz var, Age ve Genre, modelimizde kullanabilmemiz için sayılara dönüştürmemiz gerekiyor. Bu dönüşümü yapmanın birçok farklı yolu var - Pandaları kullanacağız get_dummies() Her aralık ve tür için yeni bir sütun oluşturan ve ardından değerlerini 0'lar ve 1'lerle dolduran yöntem - bu tür işleme denir tek sıcak kodlama. Nasıl göründüğüne bir bakalım:


customer_data_oh = pd.get_dummies(customer_data)

customer_data_oh 

Bu bize ortaya çıkan tablonun bir ön izlemesini verecektir:

img

Çıktı ile, sütunun olduğunu görmek kolaydır. Genre sütunlara bölündü - Genre_Female ve Genre_Male. Müşteri kadın olduğunda, Genre_Female eşittir 1, ve müşteri erkek olduğunda, eşittir 0.

Ayrıca Age Groups sütun, her aralık için bir tane olmak üzere 6 sütuna bölünmüştür, örneğin Age Groups_(15, 20], Age Groups_(20, 30], ve benzeri. Aynı şekilde Genre, müşteri 18 yaşında olduğunda, Age Groups_(15, 20] değer şudur 1 ve diğer tüm sütunların değeri 0.

The avantaj tek-sıcak kodlamanın özelliği, sütun değerlerini temsil etmedeki basitliktir, ne olduğunu anlamak kolaydır. dezavantaj zaten sahip olduğumuz sütunları özetlemek için şimdi 8 ek sütun oluşturduk.

uyarı: Bir sıcak kodlanmış sütun sayısının satır sayısını aştığı bir veri kümeniz varsa, veri boyutluluk sorunlarından kaçınmak için başka bir kodlama yöntemi kullanmak en iyisidir.

Tek-sıcak kodlama da verilerimize 0'lar ekleyerek onu daha seyrek hale getirir, bu da veri seyrekliğine duyarlı bazı algoritmalar için bir sorun olabilir.

Kümeleme ihtiyaçlarımız için tek sıcak kodlama işe yarıyor gibi görünüyor. Ancak, kümelememiz için gerçekten farklı gruplar olup olmadığını görmek için verileri çizebiliriz.

Temel Çizim ve Boyut Azaltma

Veri kümemizde 11 sütun var ve bu verileri görselleştirmenin bazı yolları var. Birincisi, onu 10 boyutlu olarak çizmektir (bunun için iyi şanslar). on çünkü Customer_ID sütun dikkate alınmaz. İkincisi, ilk sayısal özelliklerimizi çizerek ve üçüncüsü, 10 özelliğimizi 2'ye dönüştürerek - bu nedenle, bir boyutsallık indirgemesi yapmaktır.

Her Veri Çiftini Çizmek

10 boyutu çizmek biraz imkansız olduğundan, ikinci yaklaşımı tercih edeceğiz - ilk özelliklerimizi çizeceğiz. Kümeleme analizimiz için bunlardan ikisini seçebiliriz. Tüm veri çiftlerimizi bir arada görmemizin bir yolu, bir Seaborn ile pairplot():

import seaborn as sns


customer_data = customer_data.drop('CustomerID', axis=1)

sns.pairplot(customer_data)

Hangi görüntüler:

img

Bir bakışta, veri gruplarına sahip gibi görünen dağılım grafiklerini görebiliriz. İlginç görünen bir tanesi, aşağıdakileri birleştiren dağılım grafiğidir. Annual Income ve Spending Score. Diğer değişken dağılım grafikleri arasında net bir ayrım olmadığına dikkat edin. En fazla, belki de iki farklı nokta konsantrasyonu olduğunu söyleyebiliriz. Spending Score vs Age dağılım grafiği.

Her iki dağılım grafiğinden oluşan Annual Income ve Spending Score özünde aynıdır. x ve y ekseni yer değiştirdiği için iki kez görebiliriz. Bunlardan herhangi birine bakarak, beş farklı grup gibi görünenleri görebiliriz. Seaborn ile sadece bu iki özelliği çizelim scatterplot() daha yakından bakmak için:

sns.scatterplot(x=customer_data['Annual Income (k$)'],
                y=customer_data['Spending Score (1-100)'])

img

Daha yakından bakarak 5 farklı veri grubunu kesinlikle ayırt edebiliriz. Müşterilerimiz bir yılda ne kadar kazandıklarına ve ne kadar harcadıklarına göre gruplandırılabiliyor gibi görünüyor. Bu, analizimizdeki bir başka ilgili noktadır. Müşterilerimizi gruplamak için sadece iki özelliği dikkate almamız önemlidir. Onlar hakkında sahip olduğumuz diğer hiçbir bilgi denkleme girmiyor. Bu, analize anlam kazandırır – bir müşterinin ne kadar kazandığını ve harcadığını bilirsek, ihtiyacımız olan benzerlikleri kolayca bulabiliriz.

img

Bu harika! Şimdiye kadar, modelimizi oluşturmak için zaten iki değişkenimiz var. Bunun temsil ettiği şeyin yanı sıra, modeli daha basit, cimri ve daha açıklanabilir hale getirir.

En iyi uygulamalar, endüstri tarafından kabul edilen standartlar ve dahil edilen hile sayfası ile Git'i öğrenmek için uygulamalı, pratik kılavuzumuza göz atın. Googling Git komutlarını durdurun ve aslında öğrenmek o!

Not: Veri Bilimi genellikle mümkün olduğunca basit yaklaşımları tercih eder. Sadece işletme için açıklaması daha kolay olduğu için değil, aynı zamanda daha doğrudan olduğu için - 2 özellik ve açıklanabilir bir model ile modelin ne yaptığı ve nasıl çalıştığı açıktır.

PCA Kullandıktan Sonra Verileri Çizmek

İkinci yaklaşımımız muhtemelen en iyisi gibi görünüyor, ancak üçüncü yaklaşımımıza da bir göz atalım. Çok fazla boyutu olduğu için verileri çizemediğimizde veya gruplarda veri konsantrasyonu veya net ayrım olmadığında yararlı olabilir. Bu durumlar meydana geldiğinde, adı verilen bir yöntemle veri boyutlarını küçültmeyi denemeniz önerilir. Temel Bileşen Analizi (PCA).

Not: Çoğu insan, görselleştirmeden önce boyutluluğu azaltmak için PCA'yı kullanır. Kümelemeden önce veri görselleştirmeye yardımcı olan başka yöntemler de vardır, örneğin: Gürültülü Uygulamaların Yoğunluk Tabanlı Mekansal Kümelenmesi (DBSCAN) ve Kendi Kendini Düzenleyen Haritalar (SOM) kümeleme. Her ikisi de kümeleme algoritmalarıdır, ancak veri görselleştirme için de kullanılabilir. Kümeleme analizinin altın standardı olmadığından, farklı görselleştirmeleri ve farklı algoritmaları karşılaştırmak önemlidir.

PCA, mümkün olduğu kadar çok bilgiyi korumaya çalışırken verilerimizin boyutlarını azaltacaktır. Önce PCA'nın nasıl çalıştığı hakkında bir fikir edinelim ve ardından verilerimizi kaç veri boyutuna indireceğimizi seçebiliriz.

Her bir özellik çifti için PCA, bir değişkenin daha büyük değerlerinin diğer değişkenin daha büyük değerlerine karşılık gelip gelmediğini görür ve aynı şeyi daha küçük değerler için yapar. Bu nedenle, öznitelik değerlerinin birbirine göre ne kadar değiştiğini hesaplar – biz buna onların kovaryans. Bu sonuçlar daha sonra bir matris halinde düzenlenir ve bir kovaryans matrisi.

Kovaryans matrisini aldıktan sonra PCA, onu en iyi açıklayan özelliklerin doğrusal bir kombinasyonunu bulmaya çalışır; durumu açıklayanı tanımlayana kadar doğrusal modellere uyar. maksimum varyans miktarı.

not: PCA doğrusal bir dönüşümdür ve doğrusallık veri ölçeğine duyarlıdır. Bu nedenle, tüm veri değerleri aynı ölçekte olduğunda PCA en iyi sonucu verir. Bu, sütunu çıkararak yapılabilir. ortalama değerlerinden ve sonucun standart sapmasına bölünmesiyle elde edilir. buna denir veri standardizasyonu. PCA'yı kullanmadan önce verilerin ölçeklendiğinden emin olun! Nasıl olduğundan emin değilseniz, okuyun “Python'da Makine Öğrenimi için Scikit-Learn ile Özellik Ölçekleme Verileri”!

Bulunan en iyi çizgi (doğrusal kombinasyon) ile PCA, eksenlerinin yönlerini alır. özvektörler, ve lineer katsayıları, özdeğerler. Özvektörlerin ve özdeğerlerin - veya eksen yönleri ve katsayılarının - kombinasyonu, Ana bileşenleri PCA'nın. İşte o zaman, ne kadar varyansı açıkladıklarına bağlı olarak hangi temel bileşenleri tutmak veya atmak istediğimizi anlayarak, her bir özelliğin açıklanan varyansına dayalı olarak boyut sayımızı seçebiliriz.

Ana bileşenleri elde ettikten sonra, PCA, verileri orijinal eksenlerden ana bileşenler tarafından temsil edilenlere yeniden yönlendiren bir özellik vektörü oluşturmak için özvektörleri kullanır - veri boyutları bu şekilde azaltılır.

Not: Burada dikkate alınması gereken önemli bir ayrıntı, doğrusal doğası nedeniyle PCA'nın açıklanan varyansın çoğunu ilk temel bileşenlerde yoğunlaştırmasıdır. Dolayısıyla açıklanan varyansa bakıldığında genellikle ilk iki bileşenimiz yeterli olacaktır. Ancak bu, bazı durumlarda yanıltıcı olabilir - bu nedenle, kümeleme yaparken benzer sonuçları alıp almadıklarını görmek için farklı grafikleri ve algoritmaları karşılaştırmaya devam edin.

PCA'yı uygulamadan önce, aşağıdakiler arasında seçim yapmamız gerekir. Age sütun veya Age Groups daha önce tek sıcak kodlanmış verilerimizdeki sütunlar. Her iki sütun da aynı bilgiyi temsil ettiğinden, onu iki kez tanıtmak veri varyansını etkiler. Eğer Age Groups sütun seçilirse, yalnızca Age Pandaları kullanan sütun drop() yöntemine yeniden atayın ve customer_data_oh değişken:

customer_data_oh = customer_data_oh.drop(['Age'], axis=1)
customer_data_oh.shape 

Artık verilerimizin 10 sütunu var, bu, sütun bazında bir ana bileşen elde edebileceğimiz ve yeni bir boyutun ne kadarını tanıtmanın veri varyansımızın daha fazlasını açıkladığını ölçerek bunlardan kaç tanesini kullanacağımızı seçebileceğimiz anlamına geliyor.

Bunu Scikit-Learn ile yapalım PCA. Her boyutun açıklanan varyansını hesaplayacağız. explained_variance_ratio_ ve ardından kümülatif toplamlarına bakın cumsum() :

from sklearn.decomposition import PCA

pca = PCA(n_components=10)
pca.fit_transform(customer_data_oh)
pca.explained_variance_ratio_.cumsum()

Kümülatif açıklanan varyanslarımız:

array([0.509337  , 0.99909504, 0.99946364, 0.99965506, 0.99977937,
       0.99986848, 0.99993716, 1.        , 1.        , 1.        ])

İlk boyutun verilerin %50'sini, ikinci boyutla birleştirildiğinde ise %99'unu açıkladığını görüyoruz. Bu, ilk 2 boyutun verilerimizin %99'unu zaten açıkladığı anlamına gelir. Böylece 2 bileşenli bir PCA uygulayabilir, temel bileşenlerimizi alabilir ve bunları çizebiliriz:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pcs = pca.fit_transform(customer_data_oh)

pc1_values = pcs[:,0]
pc2_values = pcs[:,1]
sns.scatterplot(x=pc1_values, y=pc2_values)

img

PCA'dan sonraki veri grafiği, PCA'sız verilerin yalnızca iki sütununu kullanan çizime çok benzer. Grupları oluşturan noktaların PCA'dan sonra öncekinden daha yakın ve biraz daha yoğun olduğuna dikkat edin.

img

Hiyerarşik Yapıyı Dendrogramlarla Görselleştirme

Şimdiye kadar, verileri, tek sıcak kodlanmış kategorik sütunları araştırdık, hangi sütunların kümelemeye uygun olduğuna karar verdik ve veri boyutunu azalttık. Grafikler, verilerimizde 5 kümemiz olduğunu gösteriyor, ancak noktalarımız arasındaki ilişkileri görselleştirmenin ve küme sayısını belirlemeye yardımcı olmanın başka bir yolu da var. dendrograma (genellikle dendogram olarak yanlış yazılır). dendro anlamına geliyor ağaç Latince.

The dendrograma bir veri kümesindeki noktaların bağlanmasının bir sonucudur. Hiyerarşik kümeleme sürecinin görsel bir temsilidir. Ve hiyerarşik kümeleme süreci nasıl çalışır? Pekala… duruma göre değişir – muhtemelen Veri Biliminde zaten çokça duymuş olduğunuz bir cevap.

Hiyerarşik Kümelemeyi Anlama

Zaman Hiyerarşik Kümeleme Algoritması (HCA) noktaları birleştirmeye ve kümeleri bulmaya başlar, önce noktaları 2 büyük gruba ayırabilir ve daha sonra bu iki grubun her birini daha küçük 2 gruba ayırabilir, toplamda 4 grup olur. ayrılık yaratan ve yukarıdan aşağıya yaklaşım.

Alternatif olarak, tam tersini yapabilir - tüm veri noktalarına bakabilir, birbirine daha yakın olan 2 nokta bulabilir, bunları bağlayabilir ve sonra bu bağlantılı noktalara en yakın olan diğer noktaları bulabilir ve 2 grubu oluşturmaya devam edebilir. itibaren altüst. Hangisi aglomeratif yaklaşımı geliştireceğiz.

Toplu Hiyerarşik Kümeleme Gerçekleştirme Adımları

Aglomeratif yaklaşımı daha da net hale getirmek için, aşağıdaki adımlar vardır: Aglomeratif Hiyerarşik Kümeleme (AHC) algoritması:

  1. Başlangıçta, her veri noktasını tek bir küme olarak ele alın. Bu nedenle, başlangıçtaki küme sayısı K olacaktır - K ise veri noktalarının sayısını temsil eden bir tamsayıdır.
  2. K-1 kümeleriyle sonuçlanan en yakın iki veri noktasını birleştirerek bir küme oluşturun.
  3. K-2 kümeleriyle sonuçlanan en yakın iki kümeyi birleştirerek daha fazla küme oluşturun.
  4. Büyük bir küme oluşana kadar yukarıdaki üç adımı tekrarlayın.

not: Basitleştirmek için 2. ve 3. adımlarda “en yakın iki” veri noktası diyoruz. Ancak birazdan göreceğimiz gibi noktaları bağlamanın daha fazla yolu var.

ACH algoritmasının adımlarını ters çevirirseniz, 4'ten 1'e giderseniz, bunlar şu adımlar olacaktır: *Bölücü Hiyerarşik Kümeleme (DHC)*.

HCA'ların bölücü ve yukarıdan aşağıya ya da toplayıcı ve aşağıdan yukarıya olabileceğine dikkat edin. Yukarıdan aşağıya DHC yaklaşımı, daha az ancak daha büyük kümeleriniz olduğunda en iyi sonucu verir, dolayısıyla hesaplama açısından daha pahalıdır. Öte yandan, aşağıdan yukarıya AHC yaklaşımı, çok sayıda küçük kümeniz olduğunda uygundur. Hesaplamalı olarak daha basittir, daha çok kullanılır ve daha erişilebilirdir.

Not: Ya yukarıdan aşağıya ya da aşağıdan yukarıya, kümeleme sürecinin dendrogram temsili her zaman ikiye bölme ile başlayacak ve temel yapısı ikili bir ağaç olduğunda, her bir noktanın ayırt edilmesiyle sona erecektir.

Verilerin hiyerarşik ilişkilerini görselleştirmek için müşteri veri dendrogramımızı çizelim. Bu sefer, kullanacağız scipy veri kümemiz için dendrogramı oluşturmak için kütüphane:

import scipy.cluster.hierarchy as shc
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 7))
plt.title("Customers Dendrogram")


selected_data = customer_data_oh.iloc[:, 1:3]
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(Z=clusters)
plt.show()

Komut dosyasının çıktısı şöyle görünür:

img

Yukarıdaki komut dosyasında, kümeleri ve alt kümeleri noktalarımızla oluşturduk, noktalarımızın nasıl bağlanacağını tanımladık ( ward yöntemi) ve noktalar arasındaki mesafenin nasıl ölçüleceği ( euclidean metrik).

Dendrogramın çizimi ile DHC ve AHC'nin açıklanan süreçleri görselleştirilebilir. Yukarıdan aşağıya yaklaşımı görselleştirmek için, dendrogramın tepesinden başlayın ve aşağı inin ve aşağıdan yukarıya yaklaşımı görselleştirmek için aşağıdan başlayıp yukarı doğru hareket ederek tersini yapın.

Bağlantı Yöntemleri

Başka birçok bağlantı yöntemi vardır, nasıl çalıştıklarını daha iyi anlayarak ihtiyaçlarınıza uygun olanı seçebileceksiniz. Bunun yanında her biri uygulandığında farklı sonuçlar verecektir. Kümeleme analizinde sabit bir kural yoktur, mümkünse, hangisinin en uygun olduğunu görmek için sorunun doğasını inceleyin, farklı yöntemleri test edin ve sonuçları inceleyin.

Bağlantı yöntemlerinden bazıları şunlardır:

  • Tek bağlantı: olarak da anılır En Yakın Komşu (NN). Kümeler arasındaki mesafe, en yakın üyeleri arasındaki mesafe ile tanımlanır.

img

  • Komple bağlantı: olarak da anılır En Uzak Komşu (FN), En Uzak Nokta Algoritmasıya da Voor Hees Algoritması. Kümeler arasındaki mesafe, en uzak üyeleri arasındaki mesafe ile tanımlanır. Bu yöntem hesaplama açısından pahalıdır.

img

  • Ortalama bağlantı: Ayrıca şöyle bilinir UPGMA (Aritmetik ortalamalı Ağırlıksız Çift Grup Yöntemi). Her kümenin puan sayısının yüzdesi, birleştirilmişlerse iki kümenin puan sayısına göre hesaplanır.

img

  • Ağırlıklı bağlantı: Ayrıca şöyle bilinir WPGMA (Aritmetik ortalamalı Ağırlıklı Çift Grup Yöntemi). İki kümenin bireysel noktaları, daha küçük ve daha büyük bir küme arasındaki toplu mesafeye katkıda bulunur.
  • merkez bağlantı: olarak da anılır UPGMC (Centroids kullanan Ağırlıksız Çift Grup Yöntemi). Her küme için tüm noktaların ortalaması (merkez) ile tanımlanan bir nokta hesaplanır ve kümeler arasındaki mesafe, ilgili merkezlerin arasındaki mesafedir.

img

  • koğuş bağlantısı: Ayrıca şöyle bilinir ÖZEL (Kareler Toplamında Minimum Artış). İki küme arasındaki mesafeyi belirtir, kareler toplamını (ESS) hesaplar ve daha küçük ESS'ye dayalı olarak sonraki kümeleri art arda seçer. Ward's Method, her adımda ESS artışını en aza indirmeye çalışır. Bu nedenle, hatayı en aza indirgemek.

img

Mesafe Metrikleri

Bağlantının yanı sıra, en çok kullanılan mesafe ölçümlerinden bazılarını da belirtebiliriz:

  • Öklid: olarak da anılır Pisagor veya düz çizgi mesafe. Uzayda iki nokta arasındaki mesafeyi, aralarından geçen bir doğru parçasının uzunluğunu ölçerek hesaplar. Pisagor teoremini kullanır ve sonuç uzaklık değeridir. (C) denklemin:

$$
c^2 = a^2 + b^2
$$

  • Manhattan: olarak da adlandırılır Şehir bloğu, Taksi mesafe. İki noktanın tüm boyutlarındaki ölçüler arasındaki mutlak farkların toplamıdır. Bu boyutlar iki ise, bir blok yürürken önce sağa sonra sola gitmeye benzer.

img

  • Minkovski: hem Öklid hem de Manhattan mesafelerinin bir genellemesidir. Minkowski metriğinin sırasına göre mutlak farklılıklara dayalı mesafeleri hesaplamanın bir yoludur. p. Her ne kadar herhangi biri için tanımlanmış olsa da p> 0, nadiren 1, 2 ve ∞ (sonsuz) dışındaki değerler için kullanılır. Minkowski mesafesi, Manhattan mesafesi ile aynıdır. p = 1, ve ne zaman Öklid mesafesi ile aynı p = 2.

$$
Bleft(X,Ysağ) = sol(toplam_{i=1}^n |x_i-y_i|^doğru)^{frac{1}{p}}
$$

img

  • Chebyshev: Ayrıca şöyle bilinir satranç tahtası mesafe. Minkowski mesafesinin en uç örneğidir. Parametrenin değeri olarak infinity kullandığımızda p (p = ∞), koordinatlar arasındaki maksimum mutlak fark olarak mesafeyi tanımlayan bir metrik elde ederiz.
  • Kosinüs: iki nokta veya vektör dizisi arasındaki açısal kosinüs uzaklığıdır. Kosinüs benzerliği, vektörlerin uzunluklarının çarpımına bölünmesiyle elde edilen nokta çarpımıdır.
  • jakar: sonlu nokta kümeleri arasındaki benzerliği ölçer. Her bir kümedeki (kesişim) ortak noktalarda bulunan toplam puan (kardinalite) sayısının, her iki kümenin (birlik) toplam puanlarının toplam puan sayısına (kardinalite) bölünmesi olarak tanımlanır.
  • Jensen Shannon: Kullback-Leibler ayrımına dayalıdır. Noktaların olasılık dağılımlarını dikkate alır ve bu dağılımlar arasındaki benzerliği ölçer. Olasılık teorisi ve istatistiğin popüler bir yöntemidir.

Biz seçildik Koğuş ve Öklid Dendrogram için, çünkü bunlar en yaygın kullanılan yöntem ve metriktir. Ward noktaları hataları en aza indirmeye dayalı olarak bağladığından ve Öklid daha düşük boyutlarda iyi çalıştığından genellikle iyi sonuçlar verirler.

Bu örnekte, pazarlama verilerinin iki özelliği (sütunları) ve 200 gözlem veya satırla çalışıyoruz. Gözlem sayısı öznitelik sayısından (200 > 2) fazla olduğu için düşük boyutlu bir uzayda çalışıyoruz.

Özellik sayısı ne zaman (F) gözlem sayısından daha büyük (N) - çoğunlukla olarak yazılır f >> Hbu, sahip olduğumuz anlamına gelir yüksek boyutlu uzay.

Daha fazla öznitelik ekleseydik, yani 200'den fazla özniteliğe sahip olsaydık, Öklid mesafesi çok iyi çalışmayabilir, çünkü sadece büyüyen çok büyük bir uzayda tüm küçük mesafeleri ölçmekte zorluk çekerdi. Başka bir deyişle, Öklid uzaklık yaklaşımı verilerle çalışmakta güçlük çekiyor. kıtlık. Bu denilen bir sorun boyutluluğun laneti. Mesafe değerleri o kadar küçülür ki, sanki daha geniş alanda “seyreltmişler”, 0 olana kadar bozulurlar.

Not: Bir veri kümesiyle karşılaşırsanız f >> p, muhtemelen aşağıdaki gibi diğer mesafe ölçümlerini kullanacaksınız: mahalanobis mesafe. Alternatif olarak, kullanarak veri kümesi boyutlarını da azaltabilirsiniz. Temel Bileşen Analizi (PCA). Bu sorun, özellikle biyolojik sıralama verilerini kümelerken sık görülür.

Metrikleri, bağlantıları ve her birinin sonuçlarımızı nasıl etkileyebileceğini zaten tartışmıştık. Şimdi dendrogram analizine devam edelim ve veri kümemizdeki küme sayısı hakkında bize nasıl bir gösterge verebileceğini görelim.

Bir dendrogramda ilginç sayıda küme bulmak, dikey çizgileri olmayan en büyük yatay alanı bulmakla aynıdır (en uzun dikey çizgileri olan boşluk). Bu, kümeler arasında daha fazla ayrım olduğu anlamına gelir.

Bu en uzun mesafeden geçen yatay bir çizgi çizebiliriz:

plt.figure(figsize=(10, 7))
plt.title("Customers Dendogram with line")
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(clusters)
plt.axhline(y = 125, color = 'r', linestyle = '-')

img

Yatay çizgiyi bulduktan sonra, dikey çizgilerimizin kaç kez geçtiğini sayarız - bu örnekte 5 kez. Yani 5, aralarında en fazla mesafeye sahip olan kümelerin sayısının iyi bir göstergesi gibi görünüyor.

not: Dendrogram, küme sayısını seçmek için kullanıldığında yalnızca bir referans olarak düşünülmelidir. Bu sayıyı kolayca çıkarabilir ve tamamen bağlantı türü ve mesafe ölçümlerinden etkilenir. Derinlemesine bir küme analizi yapılırken, farklı bağlantılara ve metriklere sahip dendrogramlara bakılması ve kümelerin aralarında en fazla mesafeye sahip olduğu ilk üç satırla oluşturulan sonuçlara bakılması tavsiye edilir.

Bir Aglomeratif Hiyerarşik Kümeleme Uygulaması

Orijinal Verileri Kullanma

Şu ana kadar veri setimiz için, ilk analizimiz ve PCA analizimizle doğrulanan önerilen küme sayısını hesapladık. Artık Scikit-Learn'i kullanarak toplayıcı hiyerarşik kümeleme modelimizi oluşturabiliriz AgglomerativeClustering ile pazarlama noktalarının etiketlerini öğrenin. labels_:

from sklearn.cluster import AgglomerativeClustering

clustering_model = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model.fit(selected_data)
clustering_model.labels_

Bunun sonucu:

array([4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3,
       4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1,
       4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 0, 2, 0, 2,
       1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2])

Bu noktaya gelebilmek için çok araştırdık. Ve bu etiketler ne anlama geliyor? Burada, verilerimizin her bir noktasını 0'dan 4'e kadar bir grup olarak etiketledik:

data_labels = clustering_model.labels_
sns.scatterplot(x='Annual Income (k$)', 
                y='Spending Score (1-100)', 
                data=selected_data, 
                hue=data_labels,
                pallete="rainbow").set_title('Labeled Customer Data')

img

Bu bizim son kümelenmiş verimiz. Renk kodlu veri noktalarını beş küme şeklinde görebilirsiniz.

Sağ alttaki veri noktaları (etiket: 0, mor veri noktaları) maaşları yüksek ancak harcamaları düşük müşterilere aittir. Bunlar paralarını dikkatli harcayan müşterilerdir.

Benzer şekilde, sağ üstteki müşteriler (etiket: 2, yeşil veri noktaları), maaşları ve harcamaları yüksek müşterilerdir. Bunlar, şirketlerin hedeflediği müşteri türleridir.

Ortadaki müşteriler (etiket: 1, mavi veri noktaları), ortalama gelir ve ortalama harcamaya sahip olanlardır. En fazla müşteri bu kategoriye aittir. Şirketler, çok sayıda oldukları gerçeği göz önüne alındığında bu müşterileri de hedefleyebilir.

Sol alttaki müşteriler (etiket: 4, kırmızı) düşük maaşları ve düşük harcamaları olan müşterilerdir, promosyonlar sunarak cezbedilebilirler.

Ve son olarak, sol üstteki müşteriler (etiket: 3, turuncu veri noktaları), pazarlama tarafından ideal olarak hedeflenen yüksek gelirli ve düşük harcamalı olanlardır.

PCA'dan Sonucu Kullanma

Verilerin boyutsallığını azaltmamız gereken farklı bir senaryoda olsaydık. Ayrıca kümelenmiş PCA sonuçlarını kolayca çizebiliriz. Bu, başka bir aglomeratif kümeleme modeli yaratılarak ve her bir ana bileşen için bir veri etiketi elde edilerek yapılabilir:

clustering_model_pca = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model_pca.fit(pcs)

data_labels_pca = clustering_model_pca.labels_

sns.scatterplot(x=pc1_values, 
                y=pc2_values,
                hue=data_labels_pca,
                palette="rainbow").set_title('Labeled Customer Data Reduced with PCA')

img

Her iki sonucun da çok benzer olduğunu gözlemleyin. Temel fark, orijinal verilerle ilk sonucun açıklanmasının çok daha kolay olmasıdır. Müşterilerin yıllık gelir ve harcama puanlarına göre beş gruba ayrılabileceği açıktır. PCA yaklaşımında, tüm özelliklerimizi dikkate alırken, her birinin açıkladığı varyansa bakabildiğimiz kadar, bu, özellikle bir Pazarlama departmanına raporlama yaparken kavraması daha zor bir kavramdır.

Verilerimizi ne kadar az dönüştürmek zorunda kalırsak o kadar iyi.

Kümelemeden önce boyutsallık azaltması yapmanız gereken çok büyük ve karmaşık bir veri kümeniz varsa, PCA kullanımını yedeklemek ve sürecin açıklanabilirliğini artırmak için her bir özellik ve bunların artıkları arasındaki doğrusal ilişkileri analiz etmeye çalışın. Her bir özellik çifti için doğrusal bir model oluşturarak, özelliklerin nasıl etkileşime girdiğini anlayabileceksiniz.

Veri hacmi çok büyükse, özellik çiftlerini çizmek imkansız hale gelir, verilerinizden mümkün olduğunca dengeli ve normal dağılıma yakın bir örnek seçin ve önce örnek üzerinde analizi yapın, anlayın, ince ayar yapın o - ve daha sonra tüm veri kümesine uygulayın.

Verilerinizin doğasına göre (doğrusal, doğrusal olmayan) her zaman farklı kümeleme görselleştirme teknikleri seçebilir ve gerekirse hepsini birleştirebilir veya test edebilirsiniz.

Sonuç

Kümeleme tekniği, etiketlenmemiş veriler söz konusu olduğunda çok kullanışlı olabilir. Gerçek dünyadaki verilerin çoğu etiketlenmemiş olduğundan ve verilere açıklama eklemenin maliyeti daha yüksek olduğundan, etiketlenmemiş verileri etiketlemek için kümeleme teknikleri kullanılabilir.

Bu kılavuzda, kümeleme teknikleri büyük ölçüde pazarlama analizinde (ve ayrıca biyolojik analizde) kullanıldığı için gerçek bir veri bilimi problemini getirdik. Ayrıca iyi bir hiyerarşik kümeleme modeline ulaşmak için birçok araştırma adımını ve dendrogramların nasıl okunacağını açıkladık ve PCA'nın gerekli bir adım olup olmadığını sorguladık. Ana hedefimiz, hiyerarşik kümelemeyi bulabileceğimiz bazı tuzakların ve farklı senaryoların ele alınmasıdır.

Mutlu kümelenme!

Zaman Damgası:

Den fazla Yığın kötüye kullanımı