Seite 1 von 1

K means clustering funktioniert nicht wie erwartet

Verfasst: Montag 30. Mai 2022, 16:39
von MathGenie123
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)




Re: K means clustering funktioniert nicht wie erwartet

Verfasst: Dienstag 31. Mai 2022, 07:56
von ThomasL
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.

Re: K means clustering funktioniert nicht wie erwartet

Verfasst: Dienstag 31. Mai 2022, 08:49
von MathGenie123
der code klappt jetzt aber er klassifizert nicht sowie ich es möchte

Re: K means clustering funktioniert nicht wie erwartet

Verfasst: Dienstag 31. Mai 2022, 09:33
von __blackjack__
@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?

Re: K means clustering funktioniert nicht wie erwartet

Verfasst: Dienstag 31. Mai 2022, 10:04
von MathGenie123
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)