J'ai des points dans un espace 3 dimensions et je voudrais les regrouper. Je connais le module Python "Cluster", mais il n'a que K-moyen. Connaissez-vous un module qui a FCM (FUZZY C-MOYEN)? P>
(Si vous connaissez d'autres modules Python liés au regroupement, vous pouvez les nommer comme un bonus. Mais la question importante est celle d'un algorithme FCM dans Python.) P>
Il semble être assez facile d'utiliser FCM dans matlab ( exemple ). N'est-ce pas comme ça disponible pour Python? P>
numpy, scipe et sage fort> p>
Je n'ai pas trouvé FCM dans Numpy , Sciped ou Sage . J'ai téléchargé la documentation et la recherche. Aucun résultat p>
Il semble que le module de cluster ajouta Fuzzy C-moyen avec la prochaine version (voir feuille de route ). Mais j'en ai besoin maintenant p>
4 Réponses :
La pêche fournira une fonctionnalité floue C-signifie: http://code.google.com/p/peach/ p>
Cependant, il ne semble pas y avoir de documentation utilisable car le wiki est vide. exemple d'utilisation de la FCM avec pêche a > peut être trouvé sur son site web. P>
Je viens de l'installer et j'ai appelé l'aide: Fuzzycmeans de classe - Utilisez cette classe pour instancier un objet Fuzzy C-signifie. L'objet doit recevoir un ensemble de formation et des conditions initiales. Je n'ai pas de formation d'entraînement.
Vous pouvez également voir le code et aider à Peach.googlecode.com/svn /Trunk/peach/fuzzy/cmeans.py , il dit que l'ensemble de formation est juste que les données que vous souhaitez en regroupement. L'exemple fourni montre que vous pouvez choisir les conditions initiales au hasard
regarder paquet Scikit-Fuzzy . Il possède la fonctionnalité logique floue de base, y compris la clustering Fuzzy C-Winding. P>
Je l'ai fait à partir de zéro, en utilisant l'initialisation K ++ (avec des graines fixes et 5 centroïdes. Il ne faut pas être trop difficile de l'adonter à votre nombre de centroïdes souhaité):
# K++ initialization Algorithm:
import random
def initialize(X, K):
C = [X[0]]
for k in range(1, K):
D2 = scipy.array([min([scipy.inner(c-x,c-x) for c in C]) for x in X])
probs = D2/D2.sum()
cumprobs = probs.cumsum()
np.random.seed(20) # fixxing seeds
#random.seed(0) # fixxing seeds
r = scipy.rand()
for j,p in enumerate(cumprobs):
if r < p:
i = j
break
C.append(X[i])
return C
a = initialize(data2,5) # "a" is the centroids initial array... I used 5 centroids
# Now the Fuzzy c means algorithm:
m = 1.5 # Fuzzy parameter (it can be tuned)
r = (2/(m-1))
# Initial centroids:
c1,c2,c3,c4,c5 = a[0],a[1],a[2],a[3],a[4]
# prepare empty lists to add the final centroids:
cc1,cc2,cc3,cc4,cc5 = [],[],[],[],[]
n_iterations = 10000
for j in range(n_iterations):
u1,u2,u3,u4,u5 = [],[],[],[],[]
for i in range(len(data2)):
# Distances (of every point to each centroid):
a = LA.norm(data2[i]-c1)
b = LA.norm(data2[i]-c2)
c = LA.norm(data2[i]-c3)
d = LA.norm(data2[i]-c4)
e = LA.norm(data2[i]-c5)
# Pertenence matrix vectors:
U1 = 1/(1 + (a/b)**r + (a/c)**r + (a/d)**r + (a/e)**r)
U2 = 1/((b/a)**r + 1 + (b/c)**r + (b/d)**r + (b/e)**r)
U3 = 1/((c/a)**r + (c/b)**r + 1 + (c/d)**r + (c/e)**r)
U4 = 1/((d/a)**r + (d/b)**r + (d/c)**r + 1 + (d/e)**r)
U5 = 1/((e/a)**r + (e/b)**r + (e/c)**r + (e/d)**r + 1)
# We will get an array of n row points x K centroids, with their degree of pertenence
u1.append(U1)
u2.append(U2)
u3.append(U3)
u4.append(U4)
u5.append(U5)
# now we calculate new centers:
c1 = (np.array(u1)**2).dot(data2) / np.sum(np.array(u1)**2)
c2 = (np.array(u2)**2).dot(data2) / np.sum(np.array(u2)**2)
c3 = (np.array(u3)**2).dot(data2) / np.sum(np.array(u3)**2)
c4 = (np.array(u4)**2).dot(data2) / np.sum(np.array(u4)**2)
c5 = (np.array(u5)**2).dot(data2) / np.sum(np.array(u5)**2)
cc1.append(c1)
cc2.append(c2)
cc3.append(c3)
cc4.append(c4)
cc5.append(c5)
if (j>5):
change_rate1 = np.sum(3*cc1[j] - cc1[j-1] - cc1[j-2] - cc1[j-3])/3
change_rate2 = np.sum(3*cc2[j] - cc2[j-1] - cc2[j-2] - cc2[j-3])/3
change_rate3 = np.sum(3*cc3[j] - cc3[j-1] - cc3[j-2] - cc3[j-3])/3
change_rate4 = np.sum(3*cc4[j] - cc4[j-1] - cc4[j-2] - cc4[j-3])/3
change_rate5 = np.sum(3*cc5[j] - cc5[j-1] - cc5[j-2] - cc5[j-3])/3
change_rate = np.array([change_rate1,change_rate2,change_rate3,change_rate4,change_rate5])
changed = np.sum(change_rate>0.0000001)
if changed == 0:
break
print(c1) # to check a centroid coordinates c1 - c5 ... they are the last centroids calculated, so supposedly they converged.
print(U) # this is the degree of pertenence to each centroid (so n row points x K centroids columns).
Il y a un package flou-c-signifie dans le PYPI. Découvrez le lien: FUZZY-C-signifie Python P>
C'est le moyen le plus simple d'utiliser FCM dans Python. J'espère que ça vous aide. P>
Je regarderais
numpy code> etsciped code>.Certaines des options sous Cette autre question pourrait être utile pour vous.