Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques d'apprentissage automatique Discussion :

Algorithme Kmeans clustering


Sujet :

Bibliothèques d'apprentissage automatique

  1. #1
    Nouveau membre du Club
    Algorithme Kmeans clustering
    salut à tous.

    svp j'ai un programme Kmeans, je veux le modifier pour qu'il soit kmeans incrémental.

    comment pouvais-je le faire..

    et merci d'avance.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    from scipy.spatial import distance
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import style
    import pandas as pd
    #import tkinter as tk
    from tkinter import *
    from sklearn.preprocessing import LabelEncoder
    from sklearn.cluster import KMeans
    from sklearn.metrics import silhouette_samples, silhouette_score
    from sklearn.metrics import adjusted_rand_score
    import matplotlib.cm as cm
    np.seterr(divide='ignore', invalid='ignore')
     
    style.use('ggplot')
    x=0
    y=0
    silhouette_avg = []
    cluster_err = []
    clusters_df=[]
    adj_rand_score = []
    class K_Means:
    	def __init__(self, k = 3, tolerance = 0.0001, max_iterations = 500):
    		self.k = k
    		self.tolerance = tolerance
    		self.max_iterations = max_iterations
    		self.itr = 0
     
    	def manhattan(a,b):
    		return sum(abs(x - y) for x,y in zip(a, b))
     
    	def fit(self, data, dist):
     
    		self.centroids = {}
    		self.dist = dist
     
     
    		#Initializer les centroids par les 'k' premiers elements du dataset        
    		for i in range(self.k):
    			self.centroids[i] = data[i]
    			#self.centroids[i] = data[randint(1, taille)]
     
    		# Début des iterations
    		for i in range(self.max_iterations):
    			self.classes = {}
    			for i in range(self.k):
    				self.classes[i] = []
     
    			#Chercher la distance entre point et cluster; choix du plus proche centroid
    			for features in data:
    				if dist == "euclidean":
    								distances = [distance.euclidean(features,self.centroids[centroid]) for centroid in self.centroids]
    				elif dist == "cosine":
    								distances = [distance.cosine(features,self.centroids[centroid]) for centroid in self.centroids]
    				elif dist == "manhattan":
    								distances = [K_Means.manhattan(features,self.centroids[centroid]) for centroid in self.centroids]
    				elif dist == "minkowski":
    								distances = [distance.minkowski(features,self.centroids[centroid]) for centroid in self.centroids]
     
    				classification = distances.index(min(distances))
    				self.classes[classification].append(features)
     
    			previous = dict(self.centroids)
     
    			#Varier les points de données du cluster pour recalculer les centroïdes
    			for classification in self.classes:
    				self.centroids[classification] = np.average(self.classes[classification], axis = 0)
     
    			isOptimal = True
     
    			for centroid in self.centroids:
     
    				original_centroid = previous[centroid]
    				curr = self.centroids[centroid]
    				if len(original_centroid)!=0:
    					if np.sum((curr - original_centroid)/(original_centroid) * 100.0) > self.tolerance:
    						isOptimal = False
    			self.itr += 1
    			#sortir de la boucle si les résultats sont optimaux, à savoir. les centroïdes ne changent pas beaucoup leurs positions (plus que la tolérance)
    			if isOptimal:
    				break

  2. #2
    Expert confirmé
    Bonjour,

    Tu pourrais aller sur le forum algorithmie, pour qu'on te donne l'algorithme ou qu'on t'explique ce que c'est afin de le traduire en python par la suite...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Nouveau membre du Club
    merci..

    c'est fait..

  4. #4
    Nouveau membre du Club
    personne??

  5. #5
    Expert confirmé
    Il faut chercher avec KMeans Incremental python sur Google, à priori, en très peu de recherches, j'ai trouvé une autre classe pouvant aller dans ce sens, mais n'y connaissant rien, je ne peux assurer une réponse sûre.

    Apparemment MiniBatchKMeans se retrouve souvent dans les résultats de ma recherche.

    À toi de voir si cela convient...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Expert éminent sénior
    Salut,

    Citation Envoyé par fideel Voir le message
    personne??
    Un peu de recherche sur Internet peut être?
    Avec les mots clefs python, kmeans, incremental vous devriez trouver des solutions.
    Par contre étudier votre code et en faire un K-means incrémental, çà c'est un boulot que pas grand monde fera à votre place...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Nouveau membre du Club
    merci a vos réponses..

    Je n'ai posté ce sujet qu'après une longue recherche sur Internet, dans l'espoir de trouver ici une solution, indication... et pas une redirection vers google.

    merci à vous.

  8. #8
    Membre extrêmement actif
    Bonjour

    Ceci pourrait vous aider exemple d'incrémentation

    - B

  9. #9
    Expert confirmé
    Citation Envoyé par bonjourajax Voir le message
    Bonjour

    Ceci pourrait vous aider exemple d'incrémentation

    - B
    Oui c'est un peu ce que je propose
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  10. #10
    Expert éminent sénior
    Citation Envoyé par fideel Voir le message
    Je n'ai posté ce sujet qu'après une longue recherche sur Internet, dans l'espoir de trouver ici une solution, indication... et pas une redirection vers google.
    Des algos et des codes existent et sont faciles à trouver.
    Ils ne font peut être pas exactement ce que vous voulez mais devrait vous inspirer quant aux changements à faire à votre code initial pour construire votre solution. C'est un travail de recherche et de conception qu'on peut difficilement faire à votre place car on n'est pas dans votre tête, on ne connaît pas vos contraintes, ...
    Et sans connaître l'algo. que vous voulez réaliser avec Python, vous êtes encore loin de pouvoir coder quoi que ce soit (et de l'aide sur les difficultés que vous pourriez rencontrer à coder - on ne sait trop quoi - avec Python).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Nouveau membre du Club
    salut.
    le code que j'ai posté est simple, les étapes parcourus sont claires.

    1). Initializer les centroids par les 'k' premiers elements du dataset :

    en variante incrémentale on initialise avec k=2.

    2). Début des iterations

    2.1) Chercher la distance entre point et cluster; choix du plus proche centroid

    2.2) Varier les points de données du cluster pour recalculer les centroïdes jusqu'à convergence.

    l'algorithme du incrémental Kmeans est le suivant:



    les lien que vous m'avez donner sont des explications de l'incrémental kmeans avec la version intégrée dans Sklean. j'ai pas utilisé le kmeans du sklearn, mon programme implémente le kmeans. l'import de kmeans que vous voyez en haut du code c'est juste pour l'estimation du nombre k avec les méthodes silhouette, elbow...

    dataset utilisé c'est Iris.csv.

  12. #12
    Expert éminent sénior
    Si vous pensez que ce que vous avez comme description est suffisant, il vous reste à essayer de le coder avec Python et d'exposer, le cas échéant, les difficultés rencontrées...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre extrêmement actif
    Citation Envoyé par fred1599 Voir le message
    Oui c'est un peu ce que je propose
    Ah ouais merde
    C'est le premier lien que j'ai trouvé sur google il avait l'air de correspondre à la problématique

    - B

  14. #14
    Nouveau membre du Club
    salut.

    j'ai ce programme de la version incrémentale du kmeans, et j'ai un autre programme du kmeans de base.

    mon problème c'est lorsque je calcule le temps d'exécution de chaque un de ces programme je trouve :

    Total time in seconds: 0.3058140277862549 pour le basic.

    Total time in seconds: 0.37776637077331543 pour l'incrémentale.

    normalement je dois avoir le contraire. parce que la version incrémentale est plus rapide que la version de base.

    2ème problème: l'orsque le nombe de clusters K est supérieur à 7 j'obtient l'erreur suivante;

    Inc_Kmeans.py", line 26, in initCentroids
    centroids[i, :] = dataSet[index, :]
    File "c:\winpython-64bit-3.6.3.0qt5\python-3.6.3.amd64\lib\site-packages\numpy\matrixlib\defmatrix.py", line 284, in __getitem__
    out = N.ndarray.__getitem__(self, index)
    IndexError: index 0 is out of bounds for axis 0 with size 0

    merci d'avance.

  15. #15
    Expert éminent sénior
    Salut,

    Citation Envoyé par fideel Voir le message
    mon problème c'est lorsque je calcule le temps d'exécution de chaque un de ces programme je trouve :

    Total time in seconds: 0.3058140277862549 pour le basic.

    Total time in seconds: 0.37776637077331543 pour l'incrémentale.

    normalement je dois avoir le contraire. parce que la version incrémentale est plus rapide que la version de base.
    Il ne suffit pas de le dire, il faut aussi donner le jeu de données, les procédures de lancements des deux programmes et un code complet: si quelqu'un à le temps de travailler la dessus, il va d'abord faire tourner votre truc pour essayer de reproduire avant d'essayer de comprendre.

    2ème problème: l'orsque le nombe de clusters K est supérieur à 7 j'obtient l'erreur suivante;

    Inc_Kmeans.py", line 26, in initCentroids
    centroids[i, :] = dataSet[index, :]
    File "c:\winpython-64bit-3.6.3.0qt5\python-3.6.3.amd64\lib\site-packages\numpy\matrixlib\defmatrix.py", line 284, in __getitem__
    out = N.ndarray.__getitem__(self, index)
    IndexError: index 0 is out of bounds for axis 0 with size 0
    Je n'ai pas lu le code mais il semble normal qu'en augmentant "k", on se retrouve avec des régions vides et si la condition n'est pas testée...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #16
    Nouveau membre du Club
    c'est bon.

    merci.

###raw>template_hook.ano_emploi###