Clusteranalyse

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
Susi1999
User
Beiträge: 7
Registriert: Freitag 1. Juli 2011, 15:58

Hi,

ich hab ein großes Problem. Ich soll in Python eine Clusteranalyse mit Hilfe der Zentroidmethode durchführen
und das ohne den vorgefertigten Clusterbefehl. Mit der Distanzmatrix hatte i keine Probleme, aber das eigentliche Clustering
fehlt mir schwer. Abbruchbedienung soll sein das i nur noch zwei Cluster habe und i soll am Ende die Distanz zwischen den beiden zentren finden. Mein bisheriger Quellcod sieht wie folgt aus:

Code: Alles auswählen

import numpy as np
from math import sqrt
import os


os.chdir('D:/Uni/sas/Beleg/')
wd = os.getcwd()

#############
# Load Data #
#############

Data = np.genfromtxt(
    wd + '/hematology.txt', 
    dtype = float
    #delimiter = '\t', 
)

##################
# Distancmatrix #
##################

[z,s]=Data.shape
D = np.zeros([z,z],float)
for k in range(0,z,1): 
    for l in range(0,z,1):
        summe=0
        for j in range(0,s,1): 
            summe=summe+ (Data[k,j]-Data[l,j])*(Data[k,j]-Data[l,j])
        D[k,l]=sqrt(summe)
Brauche ganz dringend Hilfe!
Weiß auch nicht, wie ich die ganzen Informationen, die beim Clustern entstehen, speichern soll.
Zuletzt geändert von Anonymous am Freitag 1. Juli 2011, 18:06, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Susi1999: Ein paar Anmerkungen zum Quelltext:

Von `os.chdir()` solltest Du die Finger lassen. Es ist hier auch völlig überflüssig, denn statt erst das Arbeitsverzeichnis zu ändern, um es dann abzufragen und an `wd` zu binden, hättest Du den Pfad auch gleich an `wd` binden können.

Solche Abkürzungen bei Namen sollte man auch vermeiden. `working_directory` sagt viel deutlicher und direkter was die Bedeutung des Objekts für das Programm ist.

Pfade sollte man nicht mit ``+`` sondern mit `os.path.join()` zusammen setzen.

Ich bin mir ziemlich sicher, dass Du die Matrix nicht *so* berechnen sollst, also mit Schleifen über die Indizes und dann jeden Wert einzeln, sondern schon so weit wie möglich die Vorteile von `numpy`-Arrays ausnutzen sollst. Denn auf diese Art ist das in der Regel *noch* langsamer als wenn man es rein mit den Python-Grunddatentypen wie Listen und `float`\s machen würde.

Bezüglich der Namensgebung könntest Du auch mal einen Blick in PEP 8 -- Style Guide for Python Code werfen.
Susi1999
User
Beiträge: 7
Registriert: Freitag 1. Juli 2011, 15:58

Gibt es eine Möglichkeit meine Array-/ Matrixgröße im Nachgang noch zuverändern/zu vergrößern oder von vornherein keine spezielle Größe anzugeben?
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Nein, die Größe ist fest. Allerdings gibt es verschiedene Funktion (np.append, np.resize, np.concatenate, usw.) um aus einem Array einen neuen Array zu erstellen. Das ist allerdings langsam und sollte daher vermieden werden.

Grüße
Gerrit
Antworten