K means clustering funktioniert nicht wie erwartet

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

Ich habe eine Aufgabe aufbekommen in einem Modul und zwar sollen wir einen beliebigen Dataset wählen und k means anwenden. Ich habe eins genommen das in sklearn enthalten ist.
Ich habe ein Problem und zwar klassifiziert k means nicht korrekt die Daten, meine Vermutung liegt wahrscheinlich an der kmeans methode.
Leider weiß ich nicht mehr weiter.

Mfg

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs


# In[18]:


data = make_blobs(n_samples=200, n_features=2, 
                           centers=4, cluster_std=1.8,random_state=101)

plt.scatter(data[0][:,0],data[0][:,1],c=data[1],cmap='rainbow')
feature,cluster = data


# In[19]:


k = 4
random_indices = np.random.choice(len(feature), k)
initial_cs = feature[random_indices]
cs = np.copy(initial_cs)


# In[20]:


def kmeans(data, k, centroids):
    alldistances = np.array([np.linalg.norm(data - centroid, axis=1)
                             for centroid in centroids])
    assert alldistances.shape == (k, len(data))
    point_classification = np.argmin(alldistances, axis=0)
    new_centroids = np.array([np.mean(data[point_classification == pointclass],
                                      axis=0)
                              for pointclass in np.arange(k)])
    return point_classification, new_centroids
    
point_classification, new_centroids = kmeans(feature, 4, initial)   


# Ergebnisse betrachten:

fig, ax = plt.subplots(figsize=(10,10))
ax.set_xlim(np.min(feature[:,0])-0.2, np.max(feature[:,0])+0.2)
ax.set_ylim(np.min(feature[:,1])-0.2, np.max(feature[:,1])+0.2)
ax.scatter(feature[:,0], feature[:,1] , c =point_classification)
ax.plot(new_centroids[:,0],new_centroids[:,1],'+', c = 'black',markersize = 20)



Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Das experimentieren mit Jupyter Notebook oder Jupyter Lab ist eine schöne Sache. Du solltest dir nur angewöhnen, öfter mal den Kernel neu zu starten.

Beim einem schnellen Blick über den Code fällt mir diese Zeile hier auf:

Code: Alles auswählen

point_classification, new_centroids = kmeans(feature, 4, initial) 
denn spätestens an dieser Stelle schmeißt der Code nach einem Kernel Reset einen Fehler.

Für mehr fehlt mir die Zeit.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

der code klappt jetzt aber er klassifizert nicht sowie ich es möchte
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MathGenie123: Und das heisst jetzt genau was? Wie sieht der Code jetzt aus und was ist bei der Klassifizierung anders als Du das möchtest?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
MathGenie123
User
Beiträge: 43
Registriert: Montag 18. April 2022, 13:13

Wie ich das gerne hätte, wird beim ersten Grapfen angezeigt.
Beim ersten Graphen sieht man die Zuordnung der Punkte.
Beim zweiten Graph habe ich versucht mittels k means so zu klassifizeren.
Ich weiß nicht ob meine k means methode falsch ist oder ob das echt wegen den start centroids so ist

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs


# In[2]:


data = make_blobs(n_samples=200, n_features=2, 
                           centers=4, cluster_std=1.8,random_state=101)

plt.scatter(data[0][:,0],data[0][:,1],c=data[1],cmap='rainbow')
feature,cluster = data


# In[3]:


k = 4
random_indices = np.random.choice(len(feature), k)
initial_cs = feature[random_indices]
cs = np.copy(initial_cs)


# In[4]:


def kmeans(data, k, centroids):
    alldistances = np.array([np.linalg.norm(data - centroid, axis=1)
                             for centroid in centroids])
    assert alldistances.shape == (k, len(data))
    point_classification = np.argmin(alldistances, axis=0)
    new_centroids = np.array([np.mean(data[point_classification == pointclass],
                                      axis=0)
                              for pointclass in np.arange(k)])
    return point_classification, new_centroids
    
point_classification, new_centroids = kmeans(feature, 4, initial_cs)   


# Ergebnisse betrachten:

fig, ax = plt.subplots(figsize=(10,10))
ax.set_xlim(np.min(feature[:,0])-0.2, np.max(feature[:,0])+0.2)
ax.set_ylim(np.min(feature[:,1])-0.2, np.max(feature[:,1])+0.2)
ax.scatter(feature[:,0], feature[:,1] , c =point_classification)
ax.plot(new_centroids[:,0],new_centroids[:,1],'+', c = 'black',markersize = 20)


Antworten