2010-02-07 4 views
1

Je prévois d'utiliser orange pour le clustering kmeans. Je suis passé par les tutoriels, mais j'ai encore quelques questions que je voudrais poser:Python KMeans Orange Framework

Je fais face à la mise en cluster sur des vecteurs de grande dimension. 1) Y a-t-il une distance cosinus mise en œuvre? 2) Je ne veux pas donner de zéros aux valeurs vides. J'ai essayé de ne pas avoir de zéros dans les champs vides et je obtenir l'erreur:

SystemError: 'orange.TabDelimExampleGenerator': the number of attribute types does not match the number of attributes 

Comment puis-je indiquer une valeur vide? 3) Y a-t-il un moyen d'utiliser incorporer un "ID" dans la table d'exemple? Je veux étiqueter mes données par un ID (pas de classification) pour une référence plus facile. Je ne fais pas la colonne ID pour être ma partie officielle de mes données.

4) Existe-t-il un moyen de produire différemment pour le clustering de kmeans? je préférerais quelque chose dans ce format:

cluster1: [ <id1>, <id2>, ...] 
cluster2: [ <id3>, ... ] 
rather than just [1, 2, 3,1 , 2, ... ] 

Merci!

Répondre

2

Quatre questions dans une question est extrêmement embarrassante - pourquoi ne pas poser une question? Ce n'est pas comme si ça vous coûterait ;-). Quoi qu'il en soit, WRT « Comment puis-je indiquer une valeur vide? », Voir the docs en ce qui concerne l'attribut value des instances de Orange.Value:

If value is continuous or unknown, no descriptor is needed. For the latter, the result is a string '?', '~' or '.' for don't know, don't care and other, respectively.

Je ne sais pas si vous voulez dire par vide « ne sais pas » ou « don ne vous inquiétez pas, mais de toute façon vous pouvez indiquer soit. Faites attention sur les distances, cependant - de cette autre page dans the docs:

Unknown values are treated correctly only by Euclidean and Relief distance. For other measure of distance, a distance between unknown and known or between two unknown values is always 0.5.

Les distances qui sont dans cette dernière page ne sont Hamming, Maximal, Manhattan, euclidienne et de secours (ce dernier est comme Manhattan mais avec un traitement correct de valeurs inconnues) - pas de distance cosinus fournie: vous devrez le coder vous-même. Pour (4), avec juste un peu de code Python, vous pouvez évidemment formater les résultats de la manière que vous voulez. L'attribut .clusters d'un objet KMeans est une liste, exactement aussi longtemps que le nombre d'instances de données: si ce que vous voulez est une liste de listes d'instances de données, par exemple:

def loldikm(data, **k): 
    km = orange.KMeans(data, **k) 
    results = [[] for _ in km.centroids] 
    for i, d in zip(km.clusters, data): 
    results[i].append(d) 
0

Je pense que les KMeans d'origine est ne convient pas pour la distance cosinus. Pour son pas dans l'espace euclidien, vous devez définir le centroïde de la distance cosinus, et vous ne pouviez pas garantir la convergence. Mais si vos vecteurs de caractéristiques sont tous positifs, vous pouvez essayer. Plus d'informations: Add API for user defined distance function in k-means