Transcription
1. K-Means Clustering Vidéo d'introduction: À tous et bienvenue dans mes derniers cœurs d'apprentissage automatique avec le
clustering k-means en Python. Alors qui suis-je et pourquoi
devriez-vous m'écouter ? Eh bien, je suis un
programmeur paresseux et je suis l'auteur de plus de 30
cours en ligne sur la science des données, l'apprentissage
automatique et l'analyse
financière. J'ai deux masters en ingénierie et en statistiques. Ma carrière dans ce domaine s'
étend sur plus de 15 ans. J'ai travaillé dans plusieurs
entreprises que nous appelons aujourd'hui Big Tech et dans plusieurs startups. Grâce à la science des données,
j'ai augmenté
mes revenus de plusieurs millions de dollars
grâce aux équipes que je dirige. Mais surtout,
je suis très
enthousiaste à l'idée de vous proposer cette technologie
essentielle. Alors, quel est l'objet de ce cours ? Ce cours vise à vous
enseigner l'un des algorithmes fondamentaux
et de l'apprentissage automatique, connu sous le nom de clustering k-means. Voici un exemple d'algorithme d' apprentissage automatique
non supervisé. Cela signifie qu'il est destiné
à être utilisé sur des ensembles de données qui n'ont
pas d'étiquettes. Ce cours vise
à vous apprendre comment
fonctionne l'algorithme et à
vous aider à acquérir une solide
compréhension implémentant vous-même chez
k-means. Ces compétences sont essentielles
si vous souhaitez faire de la science
des données et de
l'apprentissage automatique dans le monde réel. Alors, qui doit suivre ce cours et comment vous y préparer ? Ce cours est conçu
pour les étudiants qui s'
intéressent à la
science des données et à
l'apprentissage automatique et qui ont déjà
une certaine expérience des bibliothèques de calcul
numérique
telles que NumPy et Matplotlib. Notez que cela
implique également que vous avez une certaine expérience des mathématiques
vectorielles et matricielles, qui seront utilisées
dans ce cours. La deuxième compétence dont vous aurez besoin
est la programmation de base. N'importe quel langage convient, mais comme ce
cours utilise Python, ce serait idéal. Heureusement, Python est un langage très
facile à apprendre. Donc, si vous connaissez déjà
une autre langue, vous ne devriez pas avoir de
mal à rattraper votre retard. Et pour ces deux sujets, ou une
compréhension au niveau du lycée devrait être suffisante et une compréhension de premier cycle
serait encore meilleure. Donc, en termes de ressources, quelles ressources aurez-vous besoin
pour suivre ce cours ? Heureusement, pas grand-chose. Vous aurez besoin d'un ordinateur, d'un navigateur Web et d'une
connexion à Internet. Et si vous
regardez cette vidéo, vous remplissez déjà
ces conditions. Voyons maintenant
pourquoi vous devriez suivre ce cours et ce à quoi vous devez vous
attendre. En termes simples, le
clustering K-means est l'un des principaux algorithmes abordés dans tout programme
d'apprentissage automatique. C'est fondamental,
que vous travailliez en finance, biologie ou dans tout autre domaine
impliquant l'analyse de données. clustering K-means
sera un outil utile. À la fin de ce cours, vous aurez suffisamment appris
pour utiliser ce que vous avez appris sur des ensembles de données
du monde réel. J'espère donc que vous êtes
tout aussi enthousiaste que
moi à l'idée de découvrir cet algorithme
incroyable. Merci de m'avoir écouté, et je vous
verrai lors de la prochaine conférence.
2. Une introduction facile au clustering K-means: Dans cette conférence, je
vais vous présenter l'intuition qui sous-tend le
clustering K-means et son fonctionnement. Tout d'abord, nous savons que puisqu'il s'agit d'un algorithme
d'apprentissage automatique, nous allons
travailler sur des données. Essayons donc de visualiser
certaines données que nous pourrions obtenir. La première chose que vous
remarquerez à propos de ces données est que tous ces points
sont de la même couleur. C'est parce que nous faisons de l'apprentissage
non supervisé. n'y a donc aucune classe
donnée à ces points. Chaque point n'est que le vecteur, et c'est tout ce que nous savons
de chaque point. Nous ne savons pas s'il doit
être rouge, bleu ou autre. Mais il y a une
caractéristique importante de cet ensemble de données. Que remarquez-vous à ce sujet ? Eh bien, nos capacités de
reconnaissance des formes humaines nous permettent constater
immédiatement qu'il
semble y avoir trois
groupes de données ici. En d'autres termes, nous n'avons pas
besoin de l'ensemble de données pour nous
indiquer que ces trois
groupes sont distincts. Nos propres capacités de
reconnaissance des nous
permettent de voir
cela très clairement. C'est ce que nous entendons par apprentissage
non supervisé. Ce n'est pas supervisé car personne n' a besoin de nous donner la réponse. Il s'agit également d'un concept clé de l'
intelligence générale
artificielle. Si nous voulons créer une IA
capable de naviguer dans
le monde réel. Pratiquement parlant,
il doit probablement avoir une certaine intuition générale et capacité de
reconnaissance des formes, car il serait impossible de
lui fournir des données d'entraînement pour toutes les situations
possibles. rencontre. C'est donc un point très
important. Nous utilisons nos propres capacités de
reconnaissance des pour différencier ces clusters. Cela ne se trouve pas dans les données elles-mêmes. Mais vous avez peut-être remarqué
que ce que nous venons d'examiner était une situation tout à fait unique et
très spécifique. La première limite de ces données
était qu'elles étaient bidimensionnelles. Cela est bien sûr nécessaire
car si nous avions, disons, un jeu de données à 100 dimensions, vous ne pourriez pas le voir. L'univers lui-même ne possède que
trois dimensions de l'espace. C'est donc tout ce que tu peux voir. Parfois, j'ai des étudiants qui ne
sont pas convaincus de ce fait. Donc, si vous êtes convaincu que vous pouvez voir au-delà des trois dimensions, essayez de dessiner un
cube en dix dimensions et voyez ce qui se passe. Maintenant. Pourquoi est-ce que je le mentionne ? Eh bien, la plupart des ensembles de données du monde réel ne
sont pas bidimensionnels. Par conséquent, vous ne pouvez pas voir
la plupart des données du monde réel. Par conséquent, vos propres compétences en
reconnaissance ne
sont pas utiles dans ce scénario. Ce serait bien si nous avions un algorithme pour trouver que les
clusters sont des groupes de données qui peuvent fonctionner
quelle que soit la dimensionnalité
des données. Bien sûr, c'est le but de
tout ce cours. Vous pouvez donc être sûr connaître la réponse
à cette question la
fin de ce cours. Voici un autre problème. Dans les
données originales que je vous ai montrées. Je l'ai généré pour
qu'il affiche très clairement
trois
clusters distincts. Mais que se passerait-il si nos données
ressemblaient à cela ? Et si nos données
ressemblaient à ceci ? Vous pouvez maintenant voir que les clusters ne
sont pas si clairs. En général, nous aimerions savoir si le cluster que j'ai
trouvé
est bon ou non ? Dans ce cours, nous allons également répondre à
cette question. Donc, comme première étape pour
comprendre le clustering k-means, examinons deux types de vérités
fondamentales concernant les
clusters de l'ensemble de données. Supposons qu'on me dise que
ces points jaunes, violets et verts sont les
centres de certains groupes. Et j'aimerais savoir à quel centre appartient ce
nouveau point bleu ? Et je pense qu'il
est logique que ce point, bien sûr, appartienne au centre
le plus proche. Donc, pour décider à quel cluster appartient
un point de données, je choisis le centre de
cluster le plus proche. Assez intuitif. Examinons maintenant le deuxième
fait fondamental concernant les clusters. Supposons qu'on me dise que
les points de données que vous voyez ici
appartiennent tous au même cluster. Appelons-les de X1 à X C. Nous aimerions savoir quel est
le centre de ce cluster. Bien entendu, ce n'est que la
moyenne de tous ces points de données. C'est ce
que l'on appelle aussi le centroïde, si vous pensez de
manière géométrique. Et comme vous le savez, pour
trouver la moyenne d'un ensemble de vecteurs, il faut les
additionner et les diviser par le
nombre de vecteurs. C'est ainsi que vous trouvez
le centre du cluster. La grande question, c'est que nous avons ces deux
faits fondamentaux sur les clusters. Est-il
possible de combiner ces deux idées pour nous donner
un algorithme de clustering ? Croyez-le ou non, ces deux faits fondamentaux sont tout ce dont vous avez besoin pour implémenter le clustering
K-Means. Il s'avère que si j' initialise les
centres du cluster de manière aléatoire, puis si je répète ces
deux étapes encore et encore, je convergerai vers une réponse. Donc, pour résumer, nous commençons par sélectionner des points aléatoires comme centres de
notre cluster. Ensuite, je peux utiliser le fait
que chaque point de mon jeu de données appartient simplement au cluster dont
le
centre est le plus proche. J'assigne donc tous mes points de données au centre de cluster le plus proche. Maintenant que je sais que chaque point de données
appartient à un cluster, je peux calculer de nouveaux centres de
cluster fonction de tous les points
qui lui appartiennent. Je reviens ensuite à
la première étape, qui consiste à attribuer des points de données aux nouveaux centres de clusters. Encore une fois. Plus loin dans cette section, nous verrons des
démonstrations visuelles de
la façon dont les attributions de
clusters et les centres de clusters
évoluent à chaque itération. Résumons cette conférence. Depuis lors, il était
certain que des
idées très importantes avaient été introduites. abord, nous avons
parlé du fait qu' il est
parfois très facile
pour nous de voir les clusters. Nous n'avons pas besoin que l'ensemble de données nous
indique l'étiquette
de chaque point de données. Nous pouvons facilement voir
quel point de données appartient à quel cluster. Cela signifie que nous avons
appris à comprendre les données de manière non supervisée. Ensuite, il est important de comprendre en quoi
cet exemple a été limité. Parfois, les limites entre les données peuvent ne pas être
aussi clairement définies. Et le plus souvent, nous ne serons pas en mesure d'
examiner nos données car elles ne
seront pas bidimensionnelles. Nous aimerions donc avoir
un algorithme automatique capable un algorithme automatique trouver des clusters pour nous
à partir de n'importe quel ensemble de données arbitraire. Enfin, nous avons examiné deux faits fondamentaux
concernant les clusters. Le fait que chaque point doit être affecté au
cluster dont il est le plus proche. Et le fait que chaque centre de
cluster doit simplement être le centre de chaque
point qui lui appartient. Nous avons vu que lorsque nous combinons
ces deux faits, nous obtenons l'algorithme de
clustering k-means.
3. Invitation d'exercice 1: Dans cette conférence, nous
allons vous lancer et exercer
vos compétences
en matière de codage. Ce cours est conçu
pour être un cours pratique. Ainsi, pour chaque sujet
que vous découvrirez, vous l'implémenterez dans du code. Comme je le dis, si vous pouvez l'implémenter, vous ne le comprenez pas. En fait, j'ai récemment découvert le célèbre physicien
Richard Feynman avait dit une chose très similaire. Il a dit : Ce que je ne peux pas créer, je ne le comprends pas. Donc, si vous n'êtes pas d'accord avec moi, vous n'êtes pas non plus
d'accord avec
l'un des physiciens les plus célèbres de tous les temps. D'accord, alors comment pouvez-vous mettre en pratique
ce que vous venez d'apprendre ? Eh bien, dans cette conférence, votre exercice consistera à implémenter une partie du clustering
K-means. Voici donc l'exercice. abord, vous allez générer un ensemble de
données synthétique aléatoire appelé x. Comme vous vous en souvenez, pour
l'apprentissage automatique, x doit être bidimensionnel, n par d comme nombre d' échantillons et d est le
nombre de fonctionnalités. Vous allez également créer un tableau unidimensionnel d'identités de clusters
appelé « pourquoi ». Pourquoi devrait également être de taille n, le nombre d'échantillons. En effet, pour
chacun des échantillons, vous allez
lui attribuer une identité de cluster. N'oubliez pas qu'
il doit s'agir de nombres entiers compris entre zéro et k moins
un inclus, ce qui indique que vous avez K
clusters au total. Ainsi, par exemple le premier X peut
appartenir au cluster zéro, le second X peut appartenir
au cluster un et ainsi de suite. Maintenant, la façon dont vous créez ces
données dépend entièrement de vous. Vous pouvez créer les données de
manière aléatoire ou essayer de générer des données
appropriées pour le clustering. Personnellement, j'opterais pour ce dernier car le
résultat aura plus de sens et sera finalement
plus
agréable visuellement. Supposons pour notre exemple
que n est égal à 300, d est égal à deux et k est égal à trois. Cela signifie que les identités de votre
cluster prendront les valeurs 01,2. Je suggère de
faire en sorte que vos données soient réparties de manière égale entre
les trois clusters. Vous aurez donc 100 points de
données appartenant
au cluster 1 100 points de données appartenant au cluster 2 100 points de
données appartenant
au cluster 3. OK ? Alors, une fois que vous avez
généré les données, que faites-vous avec elles ? Donc, pour résumer, ce que nous
avons jusqu'à présent est x, qui est de taille n par d, et y, qui est de taille n. L'étape suivante, qui est la
pièce maîtresse de cet exercice, consiste à calculer la
moyenne de chaque groupe. Alors, qu'est-ce que cela implique ? Supposons que j'
ai trois clusters, donc k est égal à trois. Ensuite,
vous devez parcourir en boucle chacune des
valeurs du cluster. C'est 01,2. Pour chacun de ces clusters, recherchez tous les points de données qui
appartiennent à ce cluster. Donc, pour les besoins de cet exemple, supposons que vous choisissiez le cluster zéro. Vous voulez donc trouver
tous les points de données dans x qui appartiennent au cluster zéro. Comme vous vous en souvenez, ces
informations sont stockées dans y, alors vous voulez trouver la moyenne
de tous ces points de données. Dans le cadre d'un exercice, pensez à
la taille du résultat. Je vais vous donner une minute pour
y réfléchir ou vous pouvez mettre cette vidéo en pause jusqu'à ce que
vous ayez la réponse. OK, alors, quelle est la taille
du vecteur moyen de tous les points de données
appartenant à un cluster spécifique ? Eh bien, n'oubliez pas que tous nos points
de données sont des vecteurs de
caractéristiques qui vivent
dans un espace de dimension D. Dans notre exemple, d
est simplement égal à la moyenne d'
un groupe de vecteurs
de dimension d. En d'autres termes, cela signifie
simplement que vous avez un ensemble de points de
données et
que vous souhaitez trouver le
point de données qui se trouve
au centre de gravité ou au
centre de gravité. Et bien sûr, pour ce faire,
il suffit d'additionner tous les vecteurs et de les diviser par le nombre total de vecteurs. OK ? Supposons maintenant que
pour chacun des k clusters, vous calculez les
vecteurs moyens de dimension d. Cela signifie que vous avez k
vecteurs, chacun de taille d. Bien entendu, vous pouvez les stocker dans un
tableau bidimensionnel de taille k par d. Ce devrait être le
résultat de cet exercice. Une matrice k par d qui contient
les
vecteurs moyens de dimension d pour chacun des k
clusters est notre résultat souhaité. Regardons ce problème d'une
manière différente, juste au cas où vous ne l'auriez pas
compris la première fois. Bon, supposons que nous
ayons n points de données, X1, X2, jusqu'à x n. Chacun de ces axes est un
vecteur de dimension d. De plus, nous avons n, les identités de
cluster correspondantes Y1 et Y2, jusqu'à YN. Chacun de ces y est un entier qui peut aller de
zéro à k exclusif. N'oubliez pas que si nous
combinons tous ces x en une seule matrice,
un grand X, c'est la matrice n par d à laquelle je faisais
référence tout à l'heure. Nous pouvons faire la même
chose pour tous les y pour obtenir un gros vecteur
y de longueur n. Rendons cet exemple
un peu plus concret. Supposons que Y prenne
les valeurs que vous voyez ici. Donc, Y1 est égal à zéro, Y2 est égal à un, Y3 est égal
à y quatre est égal à un, y est égal à deux, y est égal à zéro, Y est égal à zéro, y est égal à un et
y neuf est égal à deux. Il doit être clair que
n est égal à neuf. Maintenant, votre travail consiste à trouver
la moyenne de tous les x qui appartiennent à
chacun des clusters. Pour le cluster zéro,
vous devez trouver la moyenne de X1, X6, X7. C'est parce que E1, E6 et E7 sont nuls. Pour le cluster 1, vous
devez trouver la moyenne de x2, x4, annexe huit. C'est parce que Y2, y quatre et y sont égaux à un. Pour le cluster 2, vous devez
trouver la moyenne de X3, x5, X9. C'est parce que Y3, Y cinq
et Y neuf ou égal à deux. Appelons cela
signifie m1, m2 et m3. Logiquement, ils devraient
tous être des vecteurs de longueur d, puisqu'ils ne sont que la
moyenne des vecteurs de longueur D. Enfin, vous devez combiner ces trois vecteurs moyens en une seule matrice de taille k par d, où dans cet exemple, k est égal à trois. Et n'oubliez pas que les
données que nous utiliserons pour cet exercice seront générées de
manière aléatoire par vous. Comme mentionné précédemment,
vous pouvez le rendre complètement aléatoire ou le faire ressembler à des données, ce qui est approprié
pour le clustering. Vous vous demandez peut-être pourquoi nous ne pouvons pas utiliser de données réelles pour cet exercice. C'est une
question importante pour les débutants. N'oubliez pas que toutes les
données sont identiques. Par conséquent, cet
exercice serait le même quel que soit le
type de données que nous utilisons. La génération des données
vous-même
vous permet de comprendre la forme
et la nature des données, plutôt que de simplement les
charger dans un fichier CSV. Cela nécessite donc une meilleure compréhension, ce
qui est une bonne chose. De plus, étant donné que nous disposons de nombreux ensembles de données
pratiques du monde réel utilisés ailleurs dans le cours. Ce n'est pas le moment de le faire. Maintenant, je tiens à
préciser que nous ne
faisons
pas encore d'apprentissage automatique. Il s'agit simplement d'un exercice
de programmation très simple pour vous échauffer. Tout ce que nous faisons, c'est
un peu de géométrie, et j'espère que vous serez
d'accord avec moi sur ce point. Nous disons : « Voici un
tas de points de données, et chacun des points de données
appartient à un groupe différent. Déterminez maintenant la moyenne de chaque point de données
au sein de chaque groupe. D'accord, donc j'espère que vous serez
d'accord avec moi pour dire qu'il
ne s'agit que d'un simple exercice
de programmation géométrique. Et il n'y a rien à
craindre à ce stade. En prime, étant donné que nos
données sont bidimensionnelles, nous pouvons également les tracer sur
une grille bidimensionnelle. Donc, votre deuxième travail est le suivant. Premier diagramme, toutes les données sur une grille bidimensionnelle à
l'aide du nuage de points. Dans ce nuage de points, vous devez également coder par couleur
chaque point de données en
fonction
des identités de cluster stockées
dans le tableau y. Peu importe
les couleurs réelles,
il suffit que chaque point de données d' même cluster doit
avoir la même couleur. Enfin, maintenant que vous avez
les moyennes de chaque agrégat, vous devez également
tracer les centres de chaque agrégat sur le
même nuage de points. Vous devez utiliser un
style différent afin de pouvoir différencier les centres du
cluster des points de données réels. Comme vous pouvez le voir sur ce
graphique, j'ai utilisé des étoiles. OK, donc c'est l'exercice numéro un pour le regroupement de K-means. Bonne chance et à
bientôt lors de la prochaine conférence.
4. Solution d'exercice 1 (trouver des centres de cluster): Dans cette conférence, nous
allons examiner
la solution à l'exercice
précédent, l'exercice k-means numéro un. Notez qu'actuellement
je ne vais pas fournir le code pour cet exercice
car il est très court. Et parce que votre travail dans ce cours consiste à
apprendre à coder par vous-même, cela inclut la saisie, la conception et la bonne syntaxe. À tout le moins, vous devriez
pouvoir copier ce que je fais, même si je ne le
recommande pas. Si vous faites les
exercices conformément aux instructions, vous ne devriez pas avoir
besoin d'un fichier de code contenant les solutions
à ces exercices. saisie sur le clavier
permet de développer la mémoire musculaire, une
compétence inestimable à posséder lors du codage. Si vous avez une raison
légitime pour laquelle vous ne pouvez pas saisir
le code vous-même, veuillez me le faire savoir et je ferai mon mieux pour vous répondre. OK, alors allons-y. abord, nous allons
importer numpy et matplotlib dans des bibliothèques standard
pour le
calcul numérique en Python. Ensuite, nous allons définir nos paramètres
de configuration. Comme mentionné précédemment. Cela signifie que la
dimensionnalité des données correspond au nombre de
clusters de trois et au nombre de points de
données de 300. Ensuite, nous allons
créer les données. C'est peut-être la partie la plus
difficile du scénario. Parlons donc de ce que nous
voulons faire à un niveau élevé. abord, l'idée de base est
que je veux avoir trois nuages de points de données afin que chaque nuage puisse être considéré comme
un cluster différent. C'est l'image
que vous devriez avoir en tête lorsque vous
pensez au regroupement. Alors, comment pouvons-nous
générer de tels nuages ? Eh bien, une
idée possible est de
prélever des échantillons à partir de trois distributions
gaussiennes différentes, chacune avec une moyenne différente. Comme vous vous en souvenez, une distribution
gaussienne
se caractérise par sa
moyenne et sa covariance. La moyenne nous indiquera où se trouve
la Gaussienne. Et la covariance nous
indiquera comment les points de données de la
Gaussienne seraient répartis. Commençons donc par
définir trois moyens correspondant aux
trois Gaussiens. Je dirai que mon un est 00, qui est à l'origine, dira que mon deux est 55. Et nous dirons que
mon trois a 50 ans. Ensuite, je vais créer
un tableau N par D appelé x. C'est là que nous allons stocker
les données pour remplir x, nous allons commencer par les 100
premiers points, comme vous vous en souvenez, les deux-points. Ensuite, le 100 signifie sélectionner les indices de zéro à 100. Ensuite, sur le côté droit, je dis générer un tableau de taille 100 par d à partir de la normale
standard, puis j'ajoute un mu1. en résulte 100
points de données avec une dimension deux centrée sur mu et un avec une covariance
d'identité. Ensuite, je vais
faire la même chose. Mais pour les
100 prochains points de données, cette fois, les indices
seront compris entre 100 et 200. Et sur le
côté droit, les points de données seront centrés sur mu deux. Enfin, nous ferons de même
pour les 100 derniers points de données, pour les indices, 200, 300. Ces points de données
seront centrés sur mu trois. Ensuite, je vais
créer le tableau y, qui nous indique l'identité du
cluster correspondant à
chacun des axes. Comme nous venons de créer les axes
et qu'ils sont tous en ordre, la structure de
Y est très simple. C'est juste 100 zéros suivis de
100 1 suivis de 100 deux. Comme vous vous en souvenez, si vous créez une liste et
que vous la multipliez par un entier, elle répète simplement
cet élément de la liste autant de fois. Ensuite, lorsque nous utilisons l'
opération plus sur ces listes, le résultat est la
concaténation des listes. Enfin, nous avons transféré le
résultat dans un tableau NumPy. Comme il est plus facile de travailler avec des tableaux
NumPy, comparez deux listes. Notez que bien que nos données aient
une structure spéciale avec
tous les clusters dans l'ordre, le code suivant
ne suppose pas cela. En d'autres termes, le code
que nous allons écrire fonctionnera
avec des données de n'importe quelle structure. OK, la prochaine étape consiste donc à visualiser les données
que nous venons de créer. Pour ce faire, nous allons créer un nuage de points en appelant
la fonction de dispersion. Nous passons le premier argument
dans la première colonne de x. Dans le second argument, nous passons dans la
deuxième colonne de x. Dans le troisième argument nommé, nous spécifions la couleur correspondant à notre des
points de données et nous passons en y. Notez que y est juste un tas
de zéros, de un et de deux. À l'aide de ce schéma,
matplotlib
décidera couleurs réelles à
attribuer à nos points de données. Bien entendu, vous pouvez avoir
un meilleur contrôle du grain si vous souhaitez choisir vous-même
les couleurs. Mais c'est suffisant pour nous. OK, alors j'espère que c'est
ce que tu t'attendais à voir. Nous pouvons voir que nous avons
trois nuages de points de données, et chacun d'eux est
coloré selon y. Ensuite, nous allons
examiner la question, étant donné un
tableau bidimensionnel de taille n par d, par convention, comment
puis-je obtenir la taille D, ce vecteur moyen de ce tableau ? C'est-à-dire que je
voulais prendre la moyenne pour chacun des n échantillons. Maintenant, vous devez faire attention, car si vous appelez simplement
point mean par lui-même, vous obtiendrez
un scalaire unique, qui est la moyenne de chaque
élément de X. Nous ne voulons pas cela, depuis
ce que nous devrait aboutir à un
vecteur moyen, pas à un scalaire. Pour obtenir ce que nous voulons, nous devons passer l'axe des
arguments égal à zéro, ce qui signifie prendre la moyenne
le long de la dimension n. Si vous passez un axe égal à un, vous obtiendrez la moyenne
le long de la dimension d. Comme toujours, nous vous encourageons
à essayer ces choses
par vous-même afin d'avoir une meilleure
idée de leur fonctionnement. Ne me croyez pas sur parole. Ok, donc quand on lance ça et qu'on vérifie la
forme du résultat, on en obtient deux comme prévu. Ensuite, nous allons utiliser ce que nous venons de découvrir pour
calculer la moyenne de chaque cluster en utilisant les identités de
cluster fournies dans le tableau y. Pour commencer, nous allons
créer un tableau de taille K par D a appelé des moyens. Ensuite, nous allons calculer la moyenne de chaque cluster un par un, commençant par le cluster zéro. D'accord, donc ce code
est assez compact, mais en fait, il se passe beaucoup de
choses à la fois. Si vous ne comprenez pas
cela au premier coup d'œil, j'espère que vous avez fait
l'exercice
d'une manière qui n'avait aucun
sens pour vous. Vous n'aurez donc jamais
à trouver la même solution que moi. Il suffit de trouver
la même réponse. Votre code peut être complètement
différent du mien. Comme vous le savez, le code peut être
lu de l'intérieur vers l'extérieur. Commençons donc par ce qui se trouve
le plus à l'intérieur, qui est y égal, égal à zéro. Si vous ne savez pas à
quoi cela
sert, je vous recommande de l'isoler
et de l'imprimer lui-même afin
de mieux comprendre. Essentiellement, cela
renvoie un tableau booléen. Comme vous le savez, égal, égal doit renvoyer
vrai ou faux. Mais puisque nous l'
utilisons sur un tableau, c'est
pourquoi le résultat
sera également un tableau. Puisque nous disons égal à zéro, le tableau résultant
sera vrai à chaque emplacement où y est égal à zéro et
faux dans le cas contraire. OK, alors que se passe-t-il
lorsque nous indexons x avec ce tableau booléen ? Eh bien, comme vous l'avez peut-être deviné, compte tenu de l'exercice que nous faisons, cela sélectionne tous les éléments de X où l'indice est vrai. OK, alors j'espère
que c'est logique. Comme vous vous en souvenez, X est
un tableau de n lignes. Pourquoi y a-t-il aussi un tableau
avec n éléments ? Lorsque nous disons que y
est égal à zéro, cela renvoie un
tableau booléen avec n éléments. Ensuite, en indexant x avec
ce tableau booléen, nous ne récupérons que les parties de
X où l'indice était vrai. C'est-à-dire que nous
obtenons uniquement les lignes de x correspondant au moment où
y est égal à zéro. De manière équivalente, nous
n'obtenons que les lignes de X qui appartiennent au cluster zéro. Enfin, nous prenons la moyenne
en utilisant la fonction moyenne, passer un axe est égal à zéro. Ensuite, nous assignons le vecteur moyen
obtenu à notre tableau de moyennes sur le côté
gauche à l'indice zéro. Ensuite, nous faisons la même
chose pour calculer les moyennes pour le groupe
un et le groupe deux. OK, donc techniquement, c'
est la fin de l'exercice. Mais ce
serait bien si nous pouvions visualiser ce que nous venons de découvrir. La prochaine étape consiste donc à
redessiner notre nuage de points. Mais avec le cluster, nous
avons calculé précédemment. abord, nous allons commencer par dessiner le même
nuage de points que précédemment. Ensuite, nous appelons à nouveau scatter, mais cette fois en utilisant
le tableau des moyens que nous venons de créer. Comme avant. Le premier argument est la
première colonne de moyennes, qui fait référence à la
première dimension. Et le deuxième argument est
la deuxième colonne de moyens, qui fait référence à la
deuxième dimension. Ensuite, je vais transmettre quelques arguments supplémentaires pour rendre l'intrigue plus facile à voir. abord, je vais transmettre
un S égal à 500, qui contrôle la taille
des points de données. Cela fera en sorte que la moyenne soit
beaucoup plus grande que les données. Ensuite, je passe et C est égal au
rouge pour que chacun des centres du
cluster soit rouge. Cela permettra de différencier davantage
ces points de mes données. En guise de remarque, cet
exemple montre comment définir
la couleur des points de données
dans le nuage de points de données manuellement, alors que nous n'avions pas choisi les couleurs dans le diagramme de dispersion
précédent. Enfin, nous allons définir un
marqueur égal à une étoile, sorte qu'au lieu de simplement
apparaître sous
la forme d'un cercle, les moyens ressemblent à des étoiles, ce qui
les rendra encore plus faciles à voir. OK, alors exécutons-le. OK, alors j'espère que c'est
ce que vous vous attendez à ce qu'il voie. Chaque vecteur moyen apparaît approximativement au centre
de chaque agrégat. Comme indiqué,
ils représentent les centres de masse ou les centroïdes
de chaque groupe. De plus, nous pouvons voir
qu'ils se trouvent approximativement aux centres
gaussiens d'origine. L'une des étoiles est à 00, une autre à 05,
une autre à 55.
5. Prompt 2 d'exercice de K-Means: Dans cette conférence, nous
allons passer
directement à votre deuxième exercice
pour cette section. Auparavant, votre exercice
consistait à prendre un ensemble de points de données et un ensemble
d'identités de clusters. Ensuite, vous deviez trouver la moyenne
des points de données
pour chaque cluster. Cette fois, tu vas prendre
la direction opposée. Maintenant, vous recevrez un ensemble de moyens ainsi qu'un
ensemble de points de données. Votre travail
consistera à utiliser ces moyens et ces points de données
et à découvrir à quel cluster appartient chaque
point de données. Rappelez-vous donc que cela se fait fonction de la distance euclidienne
ou, de manière équivalente, de la distance
euclidienne au carré. Notez que puisque les carrés fonction
augmente
de façon monotone, que vous
preniez
le carré ou non, ne changent pas la réponse. C'est-à-dire que si vous
comparez des distances, disons 2,4, si vous
les mettez au carré, vous obtiendrez 4,16. Ainsi, la relation selon laquelle
deux est inférieur à quatre est préservée car quatre
est également inférieur à 16. Et ce ne sont que les
distances relatives qui comptent, car tout ce que vous essayez de faire
est de trouver la moyenne la plus proche. La distance réelle elle-même n'apparaît pas dans la réponse. D'accord, donc comme avant
, pensons à un exemple
très simple de la façon dont cela fonctionnera. Supposons que nous ayons trois moyennes, m ,
zéro, M1 et M2. Nous avons également neuf points de données, x1, x2, x3, jusqu'à X9. Alors, que pouvons-nous voir ? Ce que nous pouvons voir, c'est que X1, X2
et X3 sont tous plus proches
de zéro que de M1 et M2. Par conséquent, X1, X2 et X3
appartiennent au cluster zéro. De la même manière, nous
pouvons voir que X4, X5 et X6 sont plus proches de M1 que
de zéro ou de M2. Par conséquent, X4, X5 et X6
appartenaient au cluster 1. Enfin, X7, X8 et X9 sont plus proches de M2 qu'ils ne le
sont de m zéro ou m1. Par conséquent, X7, X8, X9
appartiennent au cluster 2. J'espère donc que cela a du sens. Le défi est de mettre cette intuition visuelle
dans le code. Voici comment votre code doit
fonctionner à un niveau élevé. abord, vous
allez générer un ensemble de moyennes dans une matrice
de taille k par d, comme dans l'exercice
précédent. Vous pouvez également utiliser
les mêmes valeurs pour n, d et k
que précédemment. Donc n est égal à 300, d est égal à deux et k est égal à trois. N'oubliez pas que d est égal à deux est utile car nous
pouvons le voir visuellement. Ensuite, vous allez également
générer une matrice
de données de taille n par d. Comme précédemment, vous pouvez créer ces
matrices de manière aléatoire, mais il peut être utile de les
générer de
manière logique à partir d'un
clustering perspective. soit la façon dont vous
le faites, cela dépend de vous. Personnellement. Je pense qu'il est plus utile de
générer les données manière structurée afin qu'
une
fois que vous avez trouvé la réponse, vous puissiez tracer les résultats
sous forme de vérification de santé. En parlant de cela en prime, je vous encourage
à tracer les résultats avec les résultats de l'exercice. En sortie, vous devez
avoir un vecteur de longueur n, qui nous indique l'identité
de
cluster de chaque point de données. Donc, par exemple si le premier x appartient
au cluster zéro, alors la première valeur de votre tableau de
sortie doit être zéro. Enfin, je tiens à
souligner qu'il existe de nombreuses façons de réaliser cet exercice. Vous avez peut-être entendu dire que
lorsque vous utilisez NumPy, il n'est pas bon de l'utiliser pour les boucles
parce que c'est pour les boucles ou pour le slow. Au lieu de cela, on vous a peut-être
dit qu'il était
préférable d'utiliser des opérations vectorisées. C'est-à-dire que normalement,
vous aimeriez trouver une fonction numpy capable de
faire ce que vous voulez en même temps. Personnellement, je pense
que pour cet exercice, il est plus instructif de le
faire avec des boucles pour car cela permet de réfléchir à ce qui se passe de manière algorithmique. En fin de compte, c'est à
vous de décider si vous décidez de l'utiliser pour les boucles ou non. Enfin, je tiens à répéter que, tout comme
l'exercice numéro un, s'agit pas encore tout à fait
d'apprentissage automatique. En fait, il ne s'agit que d'un
simple
échauffement de programmation en géométrie. Ce que nous faisons, c'est
prendre un ensemble de points de
données
et de centres. Et nous essayons simplement de
déterminer pour chaque point de données quel
centre est le plus proche. J'espère donc que vous serez d'accord avec
moi pour dire que cet exercice
n'est qu'un autre simple exercice
de programmation géométrique. Bon, donc bonne chance pour l'
exercice numéro deux, et je vous verrai lors de
la prochaine conférence.
6. Solution d'exercice 2 de K-Means (trouver des attributions de cluster): Dans cette conférence, nous
allons examiner la solution pour l'
exercice numéro deux de k-means. Comme précédemment, veuillez vous
assurer d'avoir terminé l'exercice avant de
regarder cette conférence. Notez que pour le moment
je ne vais pas fournir le code pour cet exercice
car il est très court. Et parce que c'est votre travail dans ce cours d'apprendre
à coder par vous-même. Cela inclut la saisie, la conception et l'obtention de la syntaxe correcte. À tout le moins, vous devriez
pouvoir copier ce que je fais, bien que je ne
recommande pas de le faire. Si vous faites les
exercices conformément aux instructions, vous ne devriez pas avoir
besoin d'un fichier de code contenant les solutions
à ces exercices. Taper sur le clavier
et développer la mémoire musculaire
, une
compétence inestimable à posséder lors du codage. Si vous avez une raison
légitime pour laquelle vous ne pouvez pas saisir
le code vous-même, veuillez me le faire savoir et je
ferai de mon mieux pour vous répondre. OK, alors allons-y. Nous allons
donc commencer par importer numpy et matplotlib,
comme avant. Ensuite, nous initialisons nos paramètres
de configuration. C'est n, le nombre d'
échantillons égal à 300, d, le nombre d'entités
est égal à deux, et k, le nombre de
clusters égal à trois. Ensuite, nous initialisons trois moyens qui nous permettront de définir
nos centres de clusters. Pour plus de commodité, j'ai utilisé les mêmes moyens
que précédemment. Ensuite, nous allons
générer les données. Nous commençons par initialiser un
tableau de tous les zéros appelé
X de la forme N par D. Ensuite,
nous définissons les 100 premiers
points qui seront normalement distribués centrés sur la moyenne avec une covariance
d'identité. Ils iront donc dans les
indices de zéro à 100. Ensuite, nous définissons les 100 points de données
suivants pour qu'ils soient distribués normalement
centrés sur la deuxième moyenne, également avec une covariance d'identité. Ils figureront sur les
indices 100 à 200. Enfin, nous avons défini les 100
derniers points de données
comme étant distribués normalement,
centrés sur la troisième moyenne, également avec une covariance d'identité. Ils iront sur les
indices 200 à 300. Ensuite, nous avons notre boucle principale, qui est au cœur
de cet exercice. Il s'agit de la boucle dans laquelle nous allons attribuer les identités du cluster. Nous allons commencer par créer
un tableau appelé Y rempli de tous les
zéros de taille n. Bien entendu, il doit
avoir la taille n car nous avons besoin d'une identité de cluster pour chacun de nos N points de
données en x. Donc y est le tableau qui
stockera l'identité de votre cluster. Ensuite, nous parcourons
les n points de données en boucle. Comme indiqué dans l'invite d'exercice
précédente, il existe de nombreuses façons de le faire, même sans que vous ayez à
écrire vous-même des boucles pour. Cependant, cela n'est pas vraiment utile pour cet
exercice, car écrire les choses de
cette façon vous aide à réfléchir plus clairement à l'
algorithme. OK, il devrait donc
être clair que puisque nous parcourons en boucle
les n points de données, nous allons trouver la
meilleure identité de cluster un par un pour chaque point de données. L'idée de base est la suivante. Pour chaque point de données,
x sous le petit n, nous allons parcourir
chacune des moyennes du cluster. Pour chacun de ces moyens, nous allons vérifier la
distance par rapport à x du petit n deux. Ça veut dire. Nous garderons une trace de
toutes ces distances afin de trouver
celle qui est minimale. Donc, si signifie que zéro est le plus proche, cela signifie que l'identité du
cluster est nulle. Si la valeur moyenne est la plus proche, cela signifie que l'
identité du cluster est une et ainsi de suite. OK, nous allons donc commencer par
initialiser une variable appelée k le plus proche à moins un. Nous utilisons moins
un comme valeur sentinelle. Cela sera remplacé au fur et à mesure que nous parcourrons
la boucle interne. De même, nous
initialisons une variable appelée min dist à l'infini. Il est clair que cette variable stockera la distance minimale entre
x de n et toutes les moyennes. En l'initialisant à l'infini, toute distance trouvée dans
la boucle sera plus petite. OK, donc ensuite, nous allons parcourir petit k égal à
zéro jusqu'au grand K. C'est-à-dire que nous allons passer en boucle
par le centre de chaque cluster. À l'intérieur de la boucle, nous trouvons la distance au carré entre x du petit n et la moyenne de k, la moyenne k eth. Si vous ne comprenez pas
pourquoi il s'agit la formule de la distance carrée, je vous recommande de revoir la définition de la distance
euclidienne carrée. Nous appellerons cette
variable D. Ensuite, nous vérifierons si
d est inférieur ou non à min dist. Bien entendu, la première fois que
nous parcourons cette boucle, cela est garanti puisque
Mendez commence par infini et
que tout
nombre fini est inférieur à l'infini. Si cette condition est vraie, nous faisons deux choses. abord, nous mettons à jour min dist
comme étant la distance actuelle d. C'est-à-dire que min dist est la plus petite distance que
nous ayons trouvée jusqu'à présent. Ensuite, nous assignons
k le plus proche comme étant le k actuel. Et encore une fois, cela signifie
que k le plus proche est l'indice du centre d'agrégat le
plus proche nous avons trouvé jusqu'à présent. Vous devez être convaincu qu'à la
fin de cette boucle, K le
plus proche
stockera l'indice du centre du cluster
le plus proche et Min dist stockera la distance
correspondante. Ainsi, à ce stade, nous pouvons attribuer k le plus proche à y, indexer ce petit
n. En d'autres termes, k le
plus proche est l'identité de
cluster pour le point de données
x du petit terrain. Lorsque la boucle externe sera terminée, nous aurons trouvé les identités des
clusters pour tous les Big N data points. Donc, à titre de vérification de santé, nous aimerions
tracer nos résultats. Heureusement, vous
savez déjà comment procéder,
car nous l'avons fait lors de
la conférence précédente. Allons-y. OK, alors j'espère que c'est ce que
vous vous attendez à ce qu'il voie. Nous pouvons voir que tous
les points de données sont assignés à
la bonne couleur, en fonction de la moyenne
dont ils sont les plus proches. Ce sont tous les points les
plus proches de 00 ou d'une couleur, qui semble être violette. Tous les points les plus proches de 05, ou d'une couleur différente,
qui semble être verte. Enfin, tous les
points de données les plus proches de 55, ou d'une autre couleur, qui
semble être jaune.
7. Invitation d'exercice 3: Dans cette conférence, nous
allons poursuivre notre discussion sur le clustering
K-means. Une chose surprenante que
vous allez apprendre est qu'en faisant les deux exercices
précédents, vous avez pratiquement
accompli 90 % du travail. Vous vous souvenez peut-être que j'ai dit que
les deux exercices précédents ne sont
que de très simples échauffements. ne s'agissait que de
simples exercices de programmation pour faire de la géométrie. Et pourtant, en même temps, vous verrez que le clustering
k-means
n'est rien d'autre que ces deux
simples exercices géométriques répétés encore et encore. Plus tôt. Au début de cette section, nous avons énoncé deux
intuitions fondamentales concernant les clusters. Rappelons-nous ce qu'ils sont. Les faits numéro un sont que
l'identité de cluster de chaque point de données doit être le centre du cluster
est le plus proche. Je veux dire, c'est tout simplement logique. Supposons, par exemple, que nous ayons
deux groupes d'étudiants, qui est très grand, disons 6 pieds en moyenne
, et l'autre qui est très petit, disons 5 pieds en moyenne. Si votre taille est de
cinq pieds 10 pouces, il devrait être évident
que vous appartenez à la grande grappe et non à
la grappe courte. Pourquoi ? Parce que vous êtes plus proche de
6 pieds, vous êtes de 5 pieds. J'espère donc que c'est intuitif. Voici donc le fait numéro deux. Le centre du cluster est
simplement la moyenne ou moyenne de tous les points de données
appartenant à ce cluster. Cela est également logique si nous avons cinq personnes
dans notre groupe, alors ce que l'on appelle le centre serait la taille moyenne de
tous les membres de notre groupe. J'espère que c'est aussi
intuitif que le facteur numéro un. De plus, vous devez
reconnaître que ces deux faits
ne sont que les deux exercices précédents. Plus tôt, j'ai dit que clustering
k-means se trouve être une boucle qui répète simplement ces deux opérations
encore et encore. Alors, qu'est-ce que cela
implique ? Eh bien, cela signifie qu'en faisant
les deux exercices précédents, vous avez déjà implémenté le clustering
at k-means. ne reste plus qu'
à les assembler. D'un autre côté, il
semble y avoir un léger problème. Ce que l'on pourrait considérer comme un problème
de poulet et d'œufs. Vous voyez que chacune des deux étapes semble dépendre des
résultats de l'autre. Pour trouver les moyens, vous avez besoin
des identités du cluster. Mais pour trouver les identités des
clusters, vous avez besoin du moyen
qui est arrivé en premier, la poule ou l'œuf. La réponse à cette question s'appelle
l'étape d'initialisation. Dans ce cas,
k-means permet de savoir si c' la poule ou l'œuf
qui passe en premier. En gros, nous assignons centres
du cluster à des points de données
choisis au hasard dans x. Il s'agit
donc d'une étape que
nous effectuons avant en revue les deux étapes dont
nous avons parlé précédemment. Le résultat final est donc le suivant. Pour initialiser les K-means,
nous commençons par sélectionner k points aléatoires dans x et les
assigner
comme centres de clusters. Ensuite, nous entrons dans une boucle. À l'intérieur de la boucle, nous
utilisons le fax numéro un. Nous attribuons chaque point de données en x à nos centres de
clusters actuels. la première exécution, ces
centres de clusters
seront simplement un sous-ensemble des points de x. Le résultat de cette étape est un nouvel ensemble d'identités de cluster. Ensuite, nous utilisons des faits
et, deuxièmement, nous recalculons
les centres de chacun des clusters
en fonction des dernières identités de
clusters. Le résultat de cette étape est donc un nouvel ensemble de centres de clusters. Ensuite, nous répétons ce
processus encore et encore jusqu'à ce que l'
algorithme converge. Alors, comment savoir quand
l'algorithme converge ? Eh bien, c'est à ce moment que les
identités du cluster cessent de changer. Lorsque les
identités des clusters cessent de changer, il est évident que les centres des
clusters cesseront également de changer. Et il ne sert à
rien de poursuivre la boucle, puisque la réponse
ne changera plus. un détail crucial que
vous devez
savoir sur le
clustering K-means. Bien que le processus que je viens décrire semble assez
simple, il n'aboutit pas à la même réponse à chaque
fois que vous l'exécutez. C'est-à-dire que k-means ne trouve jamais de solution
optimale à l'échelle mondiale. Au lieu de cela, il est uniquement possible
de trouver un optimum local. Une solution simple consiste à
exécuter
k-means plusieurs fois
, puis à choisir la meilleure réponse. Nous définirons ce que signifie le mieux
plus loin dans cette section. Pratiquement parlant, c'est à
peu près tout ce que vous pouvez faire. Et dans le monde réel, c'est très bien. J'espère donc que le prochain
exercice ne sera pas une surprise. Votre travail, avant de passer à la prochaine conférence, sera d'
implémenter k-means dans le code. N'oubliez pas que vous avez déjà
effectué la majeure partie du travail des exercices 1.2
de cette section. Tout ce que vous avez vraiment à faire est mettre ces deux choses en boucle. Le schéma de base de votre
code doit être le suivant. abord, vous allez
générer un jeu de données appelé X de forme n par d. Cette fois, vous voulez vraiment
générer un jeu approprié pour le clustering
k-means. C'est-à-dire qu'il ne faut pas
générer un jeu de données à partir d'un
seul gaussien
sans agrégats clairement discernables. Plus loin dans cette section, nous
examinerons des ensembles de données réels. Mais pour l'instant, nous
voulons simplement nous assurer que votre version de k-means fait
ce qu'elle est censée faire. Ensuite, vous allez initialiser les centres
du cluster en sélectionnant k
points sélectionnés aléatoirement parmi x. Puisque vous avez créé
les données vous-même, vous pouvez choisir les
valeurs de N, D, E, et K. Je
recommande quand même d'utiliser d est égal à deux afin que vous
puissiez visualiser les résultats. Ensuite, vous allez
entrer dans une boucle qui exécute les deux étapes dont
nous avons parlé précédemment. À l'intérieur de la boucle, vous
devez vérifier la convergence. d'autres termes, lorsque les identités du
cluster cessent de changer à ce stade, vous devez quitter la boucle. Enfin, si vous
choisissez D est égal à deux, vous devriez visualiser
les résultats. Pour ce faire,
dessinez un nuage de points des données ainsi que des identités de
cluster que vous avez trouvées. En outre, vous
devez également dessiner les centres de
clusters correspondants. Puisque vous avez déjà
appris à le faire, ne devriez pas avoir beaucoup de
mal à le refaire. Bon, alors bonne chance
pour cet exercice, et je vous verrai lors de
la prochaine conférence.
8. Solution d'exercice de K 3 K-Means en intégralité): Dans cette conférence, nous allons
implémenter le clustering et le code k-means. Comme toujours, j'espère que vous avez
eu l'occasion de terminer cet exercice avant de
regarder cette conférence. Si ce n'est pas le cas, je vous
recommande d'arrêter cette vidéo maintenant jusqu'à ce que vous ayez
terminé l'exercice. N'oubliez pas que c'est dans l'
intérêt de votre apprentissage. J'espère donc que vous avez passé du
temps de qualité à implémenter ce code. En fait, le troisième
exercice
aurait dû être beaucoup
plus facile que les deux premiers. Puisque le troisième
exercice consiste simplement assembler les deux premiers
exercices. J'espère donc que vous avez trouvé
que c'est le cas. OK, alors
allons-y. D'abord. Nous allons à nouveau importer
numpy et matplotlib. Vous savez maintenant comment nous utilisons
ces bibliothèques. Ensuite, nous définissons à nouveau les paramètres
de configuration R. C'est que d est égal à k égal à
trois et n est égal à 300. La
dimensionnalité des données est donc de deux, le nombre de clusters est de trois et le nombre d'
échantillons est de 300. Ensuite, nous créons les données. Nous commençons par créer
les vrais moyens mu un, mu deux et mu 31. Il est important de
garder à l'esprit que ces moyennes réelles ne sont pas connues
par l'algorithme K-means. Nous les connaissons parce que
nous les
utilisons pour créer les données. Mais k-means ne les
utilise pas du tout. Vous pouvez
consulter le code vous-même pour vérifier ce fait. Donc, comme précédemment, nous allons
utiliser la moyenne 0,055,05. Ensuite, nous créons notre matrice X
de taille n par d. Nous définissons les 100 premiers points
comme une gaussienne centrée sur mu une covariance
d'identité. Nous avons défini les 100 points suivants comme une gaussienne
centrée sur mu deux, toujours avec une covariance d'identité. Enfin, nous avons défini les 100
derniers points comme étant une gaussienne
centrée sur mu trois, toujours avec une covariance d'identité. J'espère donc que vous vous
souvenez
de tout cela des exercices précédents. Maintenant, vous pourriez vous demander, maintenant que nous créons le
véritable code de clustering K-means, pourquoi n'utilisons-nous toujours pas
de données réelles ? C'est donc une bonne question pour les débutants et tous les
débutants devraient être en mesure d'y répondre avant
la fin de ce cours,
si ce n'est déjà fait. OK, donc tout d'abord, n'oubliez pas que nous avons fait un
bon nombre d'exemples sur données
du monde réel en dehors
de cette conférence. L'objectif de cette conférence
est de mettre en œuvre K-Means. Le type de données que
nous utilisons n'est pas pertinent. Pourquoi n'est-ce pas pertinent ? Eh bien, n'oubliez pas que
quelles que soient les données, ce code pour le
clustering k-means ne changerait pas. n'y a donc aucun avantage réel à utiliser des données réelles
à ce stade. En fait, il n'y a qu'un
inconvénient. Alors pourquoi ? Eh bien, cela nous amène
au point numéro deux
, à savoir que l'utilisation de données
synthétiques nous permet de
tester si notre
code fonctionne comme prévu. C'est une chose importante
et, en apprentissage automatique, lorsque vous écrivez du code, vous devez tester si cela fonctionne ou non. Mais vous ne pouvez pas le faire
si vous utilisez votre code sur un ensemble de données de
grande dimension inconnu. autre côté, il s'
agit d'un ensemble de données que nous avons créé nous-mêmes et qui est
bidimensionnel, donc nous pouvons le voir. Et surtout, nous savons
quelle devrait être la réponse. C'est donc un bon moyen de tester si
notre code fonctionne ou non. J'espère donc que vous
comprenez maintenant bien
pourquoi les données synthétiques sont importantes. De plus, vous comprenez
que nous
allons toujours examiner des données réelles
ailleurs dans le cours. Vous n'avez donc perdu
aucune occasion de consulter des données réelles. OK, donc à ce stade, tracons nos données pour nous rappeler à
quoi elles ressemblent. Cette fois, nous allons uniquement
tracer x car c'est la seule chose donnée à
notre algorithme k-means, comme vous le verrez bientôt. Auparavant, lors de nos
deux premières missions d'échauffement, nous avons supposé que l'on nous
avait donné les centres du cluster ou que l'on nous avait donné les identités des
clusters. Nous sommes maintenant dans un scénario plus
réaliste où nous ne savons ni l'un ni l'autre,
nous ne connaissons que x. Cependant, même en
traçant x seul, nous pouvons voir intuitivement où
les clusters devraient se trouver. OK, alors dessinons notre intrigue. J'espère donc que vous conviendrez que les regroupements de clusters
sont très intuitifs. Plus tard, lorsque vous apprendrez des techniques
plus avancées, vous comprendrez pourquoi la
génération de nos données à partir de nuages
gaussiens est en fait
le cas d'utilisation idéal. Ensuite, nous commençons le code
pour le clustering k-means. Nous allons commencer par effectuer
l'initialisation. Comme vous vous en souvenez, cela
implique d'attribuer aléatoirement les centres des clusters en utilisant des points choisis
aléatoirement à partir de x. Donc, d'abord, nous commençons par créer un tableau de centres d'agrégat de forme K par D. C'est parce qu'
il sont k centres de clusters, chaque dimension de largeur B. Ensuite, nous faisons une boucle, k fois. À l'intérieur de la boucle, nous choisissons un indice aléatoire de
zéro à n moins un. Si cela vous intéresse,
vous pouvez vérifier qu' ils
sont choisis à partir d'une distribution
uniforme. Nous appelons le résultat
I et I est un entier compris entre
zéro et n moins un. Ensuite, nous assignons x sub I
comme centre du cluster KF. Nous prenons donc notre tableau de
centres de clusters et nous
l'indexons à k. Ensuite, nous faisons notre boucle k-means. Comme vous vous en souvenez, cela implique deux étapes répétées
encore et encore. Et ces deux étapes sont simplement les deux exercices précédents que
vous avez déjà effectués. Nous allons donc commencer par définir une variable appelée
max itérations à 20. Cela définira une limite supérieure sur le nombre d'itérations de notre
boucle. Normalement, k-means
converge assez rapidement. Vous constaterez donc que toutes
les itérations ne sont pas nécessaires. Ensuite, nous créons un tableau vide pour stocker les identités des clusters. Comme précédemment, il s'agira
d'un tableau de longueur n, qui stocke des nombres entiers compris entre zéro et k moins
un inclus. Ensuite, à des fins de débogage, je vais commencer une liste vide
appelée
identités de cluster enregistrées . Pour nous aider à visualiser ce que k-means
fait à chaque étape, nous allons enregistrer
les identités des clusters à chaque itération de la boucle. Ensuite, nous entrons dans notre boucle. Donc, je passe de zéro à
max iter est exclusif. Dans la boucle, nous faisons d'
abord une copie
du tableau des identités du cluster en appelant la fonction copy. Nous allons l'attribuer à une variable appelée anciennes identités de cluster. N'oubliez pas que c'
est ainsi que nous vérifierons si les K-means ont
convergé ou non. Si les
identités des clusters n'
ont pas changé d'une
itération à l'autre, cela ne
sert à rien de continuer car si les
identités des clusters sont les mêmes, les moyens seront
également même. Par conséquent, les deux étapes entraîneraient aucun changement. Ensuite, nous enregistrons également les anciennes identités de cluster dans notre liste Enregistrer les
identités de cluster. Ensuite, nous effectuons la première étape. Comme vous vous en souvenez,
il s'agit de déterminer si
les identités du cluster sont définies en
fonction des centres du cluster actuel. Notez que la première
fois que vous exécutez cette boucle, les centres des clusters
ne sont que des points aléatoires dans X. C'est Y. Lors des exercices précédents, il n'était pas nécessaire de donner belle apparence
aux données comme je l'ai fait. K signifie qu'à un moment donné, nous allons calculer les identités des
clusters pour lesquels les moyennes des clusters se
trouvent au mauvais endroit. C'est pourquoi j'ai donné l'instruction que
vous pouviez créer n'importe quel x et n'importe quel ensemble
de moyens de cluster. Il s'agissait uniquement d'
écrire du code de travail. Ok, donc en gros, vous
devez reconnaître que toute
cette boucle est exactement la même que
ce que nous avions avant. Je vais le parcourir plus
rapidement cette fois, puisque vous l'avez déjà vu. Tout d'abord, nous avons parcouru en boucle
tous les n points de données. Dans cette boucle, nous initialisons k
le plus proche à moins
un, une valeur sentinelle. Ensuite, nous initialisons
min dist à l'infini. Ainsi, toute distance
finie que nous calculons soit plus petite. Ensuite, nous avons parcouru
toutes les moyennes du cluster k. C'est parce que nous
voulons savoir lequel d'entre eux est le plus proche
du nième point de données. À l'intérieur de la boucle, nous calculons la
distance euclidienne au carré entre x sub n et le centre de l'
agrégat KF. Nous l'appellerons D. Ensuite, nous vérifierons si d est
inférieur à la valeur minimale actuelle. Si c'est le cas, nous enregistrons le
B actuel comme nouvelle distribution masculine, et nous enregistrons k comme k plus proche. Lorsque nous sommes
en dehors de la boucle, nous assignons k le plus proche comme étant
la nième identité du cluster. Ensuite, nous passons à la deuxième étape, qui était l'autre
exercice que nous avons fait. Il s'agit de calculer
les nouvelles moyennes de clusters en fonction des
identités de clusters que nous venons de trouver. Encore une fois, vous devez
reconnaître ce code antérieur avec quelques ajustements de
dénomination. Comme vous vous en souvenez, nous travaillons
de l'intérieur vers l'extérieur. abord, nous utilisons égal à égal pour obtenir un tableau booléen
nous indiquant quels points de données
appartiennent au cluster 01 ou deux. Ensuite, nous utilisons ce
tableau booléen comme index dans x. Ensuite, nous appelons la fonction moyenne pour obtenir la moyenne de tous
ces points de données. Et nous lui passons un
axe égal à zéro, sorte que nous prenons la
moyenne le long des lignes. Ensuite, nous l'
attribuons à notre tableau, qui contient les centres du
cluster. Une fois les étapes
1 et 2 terminées, nous pouvons vérifier la convergence. Encore une fois, vous pouvez voir que nous
utilisons le terme « égal à égal ». Nous voulons savoir si nos anciennes identités de
cluster ou si elles sont égales aux nouvelles identités de cluster que
nous venons de trouver comme précédemment, puisque les opérandes pour equal égaux à nos tableaux NumPy, cela renverra
un tableau NumPy de booléens contenant
uniquement des vrais et des faux, vrais lorsque les deux côtés sont
identiques et faux dans le cas contraire. Notez que notre algorithme n'a convergé que si toutes les
valeurs sont vraies. En gros, nous faisons
une grande déclaration. Nous disons donc si la
première position est vraie, si la deuxième
position est vraie, et si la troisième position
est vraie et ainsi de suite. ce
faire, un raccourci consiste à appeler la fonction np point all. Cela retournera vrai si
le tableau que vous transmettez contient toutes les valeurs vraies de
l'instruction if, ce qui ne se produit que si
la condition est vraie. Nous imprimons l'
itération vers laquelle nous avons convergé , puis nous appelons break
pour terminer la boucle externe. OK, alors exécutons-le. Très bien, comme vous pouvez le voir, K-means a convergé en
moins de 20 étapes. Ensuite, comme dans
notre exercice précédent, nous allons tracer le
résultat de notre algorithme. Réfléchissons donc à
cela à un niveau élevé. Au départ, nous
n'avions que le tableau x. Oui, nous avions les
véritables moyens du cluster, mais nous
prétendons ne pas les connaître. Et en fait, lorsque
vous pensez à ce que vous auriez
avec un jeu de données réel, vous ne les connaissez pas. Notre
diagramme d'origine était donc un tracé des données
uniquement, sans aucune couleur et sans
aucun centre de cluster. Maintenant, après avoir lancé K-means, nous avons plus d'informations. Nous avons maintenant des identités de clusters, qui nous permettent de
donner à chaque point chaque cluster une couleur différente. De plus, nous avons également
les centres des clusters, ce qui nous permet de les dessiner également
sur notre graphique. Comme vous vous en souvenez, nous les avons
dessinées auparavant sous forme de grandes étoiles rouges. D'accord, alors j'espère que vous pourrez reconnaître ce
code plus tôt. La première ligne crée un
nuage de points des données, colorant chaque point de données
selon les identités des clusters. Donc, tous les points
appartenant au groupe zéro, nous aurons une couleur, tous les points appartenant
au groupe un, nous aurons une autre
couleur, et ainsi de suite. Ensuite, nous appelons la fonction
scatter. Mais cette fois sur les
moyennes, comme avant, on passe S égal à 500, agrandit ces
points de données et on passe en Z égal
au rouge pour les rendre rouges. Et nous avons placé le marqueur égal à l'étoile, sorte qu'ils apparaissent sous forme d'étoiles. OK, alors exécutons-le. Très bien, alors j'espère que c'est
ce que vous vous attendez à ce qu'il voie. Ce sont les mêmes données qu'auparavant, mais elles ont maintenant des
couleurs en fonction
des identités de cluster
trouvées par K-means. De plus, nous avons marqué les centres des clusters
avec des étoiles rouges. Ce sont toutes les informations que nous
n'avions pas avant de lancer K-means où nous ne
disposons que des données elles-mêmes. Ensuite, nous avons une courte boucle pour visualiser le processus
de formation. Comme vous vous en souvenez, nous avons enregistré les identités
des clusters à chaque étape de k-means. Ainsi, en traçant les
données en fonction des identités des
clusters à chaque étape, nous pouvons voir comment les clusters évoluent à mesure que l'algorithme apprend. OK, donc si tu veux
comprendre ce code, je vais
le parcourir très rapidement. abord, nous avons saisi le nombre d'identités de cluster que nous avons stockées. Notez que c'est une variable, puisque nous ne savons pas combien fois la boucle d'entraînement se déroulera, nous l'assignerons à une
variable appelée m. Ensuite, nous appellerons la fonction des
sous-parcelles plt.plot pour définir la
taille de la parcelle. Le premier argument
définit la largeur et le second
indique la hauteur. J'ai choisi le nombre
de cinq arbitrairement, ce qui est assez grand pour moi. Mais l'important
est de régler la hauteur, qui est m, multipliée par la
taille de la largeur. C'est parce que nous
allons en faire des intrigues secondaires et
que nous voulons qu'elles s'adaptent toutes. Chacune des
sous-parcelles individuelles sera de cinq par cinq. Ok, donc ensuite on
fait une boucle m fois. À l'intérieur de la boucle, nous
appelons plt.show subplot. Cette fonction comporte trois arguments
. premier est le nombre
de lignes de notre diagramme, et le second est le nombre
de colonnes de notre diagramme. Nous allons donc avoir
m lignes et une colonne. C'est-à-dire que
nous allons créer des parcelles et qu'elles
seront toutes superposées. Le troisième argument
indique quel tracé est en dehors
des tracés m par un. En gros, c'est
juste I plus un, puisque la première valeur
de i sera zéro. Ensuite, nous obtenons y, qui
sera attribué aux identités des clusters
lors de l'itération i. Ensuite, nous appelons plt.show
scatter en transmettant nos données et pourquoi les paramètres de couleur
actuels. OK, alors exécutons-le. Très bien, j'espère que
ce graphique
vous sera utile pour voir la
progression de k-means. Vous pouvez voir que nous commençons avec tout de la même
couleur car nous initialisons les identités des
clusters pour qu'elles soient un tableau de zéros. Nous pouvons alors constater que progressivement la
séparation des clusters s'améliore. Finalement, nous obtenons
les identités finales du cluster, après quoi nous
arrêtons la formation. est important
de noter que
les identités des clusters s'
améliorent lentement à chaque étape. En définissant les identités des clusters de
manière intelligente, les identités des clusters ne s'aggravent
pas, mais seulement s'améliorent. Dans des conférences ultérieures, nous
quantifierons cette idée.
9. Objectif de K-Means (théorie): Dans cette conférence,
nous allons
parler de la fonction
objective k-means. Pour introduire cette idée, il est utile d'avoir d'abord de l'expérience avec d'autres modèles
d'apprentissage automatique, tels que la régression linéaire
et la régression logistique. Donc, si vous le faites, cela vous
sera très utile. Mais si vous ne le faites pas, faites de
votre mieux pour suivre. Donc, essentiellement, la régression
linéaire, régression
logistique et le
regroupement de K-means sont tous
des exemples d'apprentissage automatique. Le mot clé de cette
phrase est l'apprentissage. La
question importante à se poser est donc qu'entendons-nous par apprentissage ? D'une manière générale, notre modèle a
généralement un certain objectif. Oui, vous pouvez dire que notre
objectif est d'apprendre, mais nous voulons être plus
précis et plus particuliers. L'objectif est un chiffre. Dans l'apprentissage supervisé tel que régression
linéaire et la régression
logistique, ce nombre est l'erreur. Vous pouvez penser à l'objectif, comme au nombre d'
erreurs que je fais. Ainsi, apprendre, c'est configurer son cerveau de manière à
faire de moins en moins d'erreurs. J'espère donc que l'analogie avec l'apprentissage
humain est claire. Apprendre revient à
configurer votre cerveau ou votre modèle du monde
pour réduire le nombre d'erreurs. En régression linéaire,
notre objectif est la somme des erreurs quadratiques. Il y a plusieurs raisons pour
lesquelles cela a du sens, mais en voici une simple. régression linéaire consiste à trouver la
ligne qui convient le mieux. En d'autres termes, nous
aimerions que la ligne soit aussi proche que possible des
points. Sur ce graphique, vous pouvez voir
que parfois notre ligne de meilleur ajustement surestime lorsqu'
elle fait une prédiction, et d'autres fois elle
sous-estime. Ainsi, l'erreur peut
être en fait positive ou négative. Bien entendu, vous ne
voulez pas simplement additionner les zones,
car si vous ajoutez un nombre positif et un nombre négatif identiques, vous obtiendrez zéro. Par exemple, si l'une des
erreurs est plus cinq et l'autre
erreur moins cinq, plus cinq plus
moins cinq sont nuls. Et il est évident que vous ne
voulez pas que l'erreur totale soit nulle alors que votre modèle
a réellement commis une erreur différente de zéro. Par conséquent, nous trions les erreurs manière à ce qu'elles soient toutes positives. Pour les
transformer en un seul nombre, nous les additionnons, d'où la somme des erreurs au carré. C'est ce que nous appelons la somme des
erreurs carrées ou fonction de coût. Notez qu'il existe d'autres
types de fonctions de coût, telles que l'entropie croisée, qui est utilisée pour la régression
logistique. Cependant, pour ce cours, nous nous intéressons principalement
à l'erreur quadratique. Lorsque
vous entraînez
un modèle de régression linéaire ou de régression
logistique, l'étape suivante un modèle de régression linéaire ou de régression
logistique consiste à déterminer comment mettre à jour les paramètres du modèle
afin de réduire l'erreur. manière exacte de procéder n'entre pas dans le cadre
de ce cours, mais nous vous encourageons à
en apprendre davantage sur la régression linéaire et la régression logistique
si vous êtes curieux. L'important est de noter que, tout comme le clustering
k-means, cela se fait de manière itérative. C'est-à-dire que nous
avons une certaine boucle. Dans la boucle, nous mettons à jour
les paramètres du modèle. À chaque itération de la boucle, nous espérons mettre à jour les paramètres du
modèle de
manière à ce que l'
erreur s'améliore toujours. Encore une fois, la façon dont nous procédons
dépasse le cadre
de ce cours, mais nous reconnaissons que
c'est possible. noter que l'analogie avec l'apprentissage humain a également
du sens dans ce contexte. Vous pouvez considérer
chaque itération de la boucle comme un passage
à travers les données d'entraînement. C'est-à-dire que chaque fois que vous voyez
les données d'entraînement, votre compréhension
de celles-ci s'améliore, de sorte que vous réduisez
les zones que vous gagnez. Cela vaut aussi bien pour les
humains que pour les machines. Plus je pratique, plus je deviens intelligent. D'accord, il s'avère que de nombreux algorithmes d'apprentissage automatique
sont entraînés de cette manière. La méthode est, nous pensons à
une fonction de coût utile. Ensuite, nous dérivons une règle de mise à jour telle sorte que si nous continuons à
appliquer cette règle de mise à jour, le modèle améliore son erreur. Finalement, l'erreur converge
vers une valeur minimale, à laquelle vous pouvez voir que vous avez terminé
cet apprentissage. Dans ces situations,
il est utile de
tracer votre coût par
itération lorsque la formation est terminée
afin de pouvoir vérifier que le
processus de formation a bien fonctionné. Encore une fois, de nombreux algorithmes
utilisent cette méthode d'apprentissage. Comme indiqué précédemment, cela s'applique à l'agrégation de k moyennes, régression
linéaire et à la régression
logistique. Elle s'applique également aux réseaux neuronaux
profonds, l'apprentissage par
renforcement
et à la factorisation matricielle, pour
ne citer que quelques exemples
supplémentaires. OK, donc c'est l'idée de apprentissage et des
fonctions de coût en général. Mais qu'est-ce que la fonction coût ou la
fonction objective pour k-means ? En guise de remarque,
rappelons que coût et objectif et perte et
erreur sont tous synonymes. Si jamais j'utilise l'un de
ces termes à la place de l'autre, ne vous inquiétez pas. Ils ont tous la même signification. Quoi qu'il en soit, si vous
êtes à
l'aise avec la somme des erreurs au carré
pour une régression linéaire, vous
serez également à l'aise avec la
fonction de coût pour k-means, qui semble très similaire. OK, donc passons en revue
cela lentement pour que vous compreniez chaque composante
de l'objectif. abord, vous pouvez voir que c'est sous la forme d'une somme
d'erreurs au carré. Nous additionnons les n points de données et nous quadrillons l'objet à l'intérieur. Notez que comme x sub n
et m sub k sont des vecteurs, nous indiquons la
distance euclidienne avec des barres doubles. C'est notre notation
pour la norme. La partie qui prête à confusion pour certaines personnes, c'est l'
étrange notation. C'est ce qu'on appelle une fonction d'
indicateur. Il a la valeur 1
lorsque l'argument est vrai et zéro dans le cas contraire. Comme vous vous en souvenez, y sub n stocke l'identité
de cluster du nième point de données. Nous pouvons donc
interpréter cela comme suit. Bien que nous additionnions
toutes les valeurs de k, une
seule d'entre elles
contribue au coût. C'est celui qui
est égal à y de n. Et c'est parce que y de n assigne X de n à un cluster. Par conséquent, le coût est la distance au
carré entre x sub n et la moyenne de l'
agrégat auquel il appartient. J'espère donc que cela a du sens. Nous additionnons l'ensemble des n points de données. Pour chacun des n points de données, nous ajoutons une distance carrée unique. La distance quadratique que nous
ajoutons est la
distance au carré entre x sub n et la moyenne de l'
agrégat auquel il appartient. Donc, si x sub n appartient
au cluster k, alors on ajoute la
distance au carré entre x de n et m sous k. En guise de remarque, vous
pouvez voir que le petit k est la somme de un à un grand K. Dans le code. petits cas vont de
zéro à k moins un. Cela est simplement dû au fonctionnement
de la programmation en Python. Soyez donc conscient
de cette différence. Lorsque nous écrivons des équations, il est
généralement plus facile
de compter à partir de un au lieu de zéro. Il convient également d'expliquer pourquoi cet objectif est logique. Pour comprendre cela, nous pouvons envisager
différents scénarios. Examinons d'abord
le scénario dans lequel les clusters sont très
clairement définis. Tous les points de données appartenant à un cluster sont très
proches du centre du cluster. Puisque c'est le cas, toutes les distances carrées
seront très faibles. Par conséquent, la somme totale des distances au
carré sera
également très faible. Bon, maintenant, considérons
un deuxième scénario. Cette fois, les clusters
sont moins bien définis. Désormais, les points de données peuvent être très éloignés du centre
du cluster. ce fait, les
distances au carré sont plus grandes et, par conséquent, la somme totale des distances au
carré
sera plus grande. La fonction de coût
ne favorise pas ce scénario car les clusters sont moins
bien définis qu'auparavant. Considérons maintenant un
troisième scénario dans lequel
les attributions de clusters réelles
sont erronées dans ce cas, car les points de données ne sont pas affectés au centre de cluster le
plus proche. La distance quadratique
entre chaque point de données et le centre du cluster auquel
il est réellement affecté sera très grande. Comme ces distances
sont très grandes, la somme totale des distances au
carré sera également très importante. Il est donc clair
que pour réduire les coûts, nous devons attribuer chaque point de données au centre du cluster le plus proche, minimisant
ainsi la distance. Notez que grâce à
l'algorithme k-means, nous pouvons écrire la fonction
objective
d'une manière alternative et peut-être que celle-ci sera
plus facile à comprendre. Donc, dans ce forum, nous n'avons
plus besoin de faire la somme de k. Nous savons que x de n sera assigné à deux, quel que soit le
cluster dont il est le plus proche. Par conséquent, la partie interne
du coût est simplement la
distance au carré entre x de n et la moyenne
la plus proche l'utilisation
de la racine carrée
de la distance euclidienne. Dans cette forme, nous prenons
la distance minimale directement en utilisant la notation Min. une autre façon d'écrire l'objectif
k-means. Nous pouvons définir une quantité appelée matrice de
responsabilité, désignée par la lettre R. En gros, c'est
la même chose que
la fonction indicatrice que nous avons vue plus tôt. Mais maintenant, il s'agit d'une matrice
au lieu d'une fonction, essentiellement r de n k, c'est-à-dire que la valeur de la ligne n, la colonne k est égale à un. Si x de n appartient au cluster k, sinon c'est zéro. Vous devriez être en mesure de
vérifier que chaque ligne de notre correspondance à un
seul point de données dans X ne contient qu'un
seul et que le reste des valeurs doit être nul. C'est parce que x ne peut
appartenir qu'à un seul cluster. En d'autres termes, x ne peut
avoir qu' une seule identité de cluster. Encore une fois, nous sommes dans cette
situation où même si nous
additionnons toutes les valeurs de k,
techniquement, en réalité, un
seul de ces termes est zéro et les autres
sont nuls parce que la valeur de responsabilité est nul lorsque x n'appartient pas
à ces clusters. Un fait intéressant
est que pour k-means, nous n'avons pas dérivé l'algorithme
d'apprentissage de la fonction de coût. Tout ce que nous avons fait, c'est partir de deux faits simples sur clustering qui
semblaient pertinents. Ensuite, nous avons découvert que si nous répétions ces deux faits
simples en boucle, nous obtiendrions k-means. Pour résumer, ces deux
faits sont les suivants. Premièrement, les identités des
clusters doivent être attribuées de telle sorte que X de n appartienne au centre du
cluster le plus proche. Et deuxièmement, les centres du
cluster ne
sont que la moyenne de tous les
x qui lui appartiennent. Cependant, si l'on se fie à ce
que nous savons des fonctions de coût, cela ne semble pas très rigoureux. Vous vous demandez peut-être si la régression
linéaire et les réseaux de
neurones peuvent dériver leurs règles d'apprentissage à partir de
la fonction objective, pourquoi pouvons-nous faire cela pour la moyenne K ? À ce stade, nous ne
sommes pas encore prêts à comprendre comment cet
algorithme peut être dérivé. Mais si vous souhaitez en savoir plus, nous
vous invitons à vous
renseigner sur les modèles de mélanges gaussiens, également connus sous le nom de GMM. Gmm est ou un modèle probabiliste, qui peut être considéré comme une
généralisation de l'
agrégation des K-moyennes à travers
le prisme du GMM, vous pouvez dériver l'algorithme de
mise à jour pour les K-moyennes en termes de
probabiliste quantités. Donc, si vous recherchez une dérivation
plus rigoureuse, ce serait la
prochaine étape à explorer. L'objectif principal de cette
conférence est de comprendre l'idée que k-means a une fonction objective
en premier lieu. Vous ne l'auriez pas
su uniquement grâce à l'algorithme lui-même. C'est pourquoi nous n'en avons pas
discuté jusqu'à présent. Le deuxième point est que cela nous permet d'écrire plus de code. En particulier, votre
prochain exercice est le suivant. Prenez le code k-means que
nous avions précédemment et ajoutez-en plus de code afin
qu'après l'entraînement, nous puissions tracer la
fonction objectif à chaque itération. Nous nous attendons à ce qu'à chaque itération
du clustering k-means, l'objectif diminue
de plus plus jusqu'à ce qu'il converge
vers une valeur minimale. Veuillez donc écrire ce code et
confirmer que c'est vrai. Très bien, donc c'est l'exercice. Bonne chance, et à
bientôt lors de la prochaine conférence.
10. Objectif des moyens K (Code): Dans cette conférence, nous
allons terminer le prochain exercice d'
implémentation de k-means, qui consiste à tracer
la fonction de coût pendant le processus de formation. Une fois cela fait,
nous pouvons considérer notre
implémentation de k-means est terminée. Comme vous le verrez, il s'agit simplement d'une simple modification du code que nous avons
déjà écrit. Puisque nous avons terminé
la plupart des travaux de la conférence
précédente. Comme toujours,
assurez-vous d'avoir terminé cet exercice avant de
regarder cette conférence, car c'est votre
devoir pour ce cours. En d'autres termes, ne
cherchez pas les solutions pour les devoirs avant de les avoir
terminés. OK, alors allons-y. abord, vous pouvez voir que toutes les parties initiales
du code sont identiques. Les entrées sont les mêmes, les données sont les mêmes. Ce qui nous intéresse, c'est
la boucle d'entraînement K-means. Nous allons donc faire défiler la page jusqu'à
cette partie du carnet. Vous avez peut-être supposé
que nous aurions une fonction distincte pour
calculer le coût, mais il s'avère qu'il est plus simple à calculer dans
notre boucle d'entraînement. Notez que nous allons
utiliser la version
du coût qui contient
l'opérateur Min. Dans ce cas, il
n'est pas nécessaire de faire une double sommation sur les n
échantillons et les k clusters. La vraie raison pour laquelle vous
devez additionner les k clusters est
que vous devez
déterminer à quel cluster appartient chaque point de
données x de n. En K-means, cela est défini par la distance minimale entre x de n et chacune de ces moyennes. Cependant, vous vous souviendrez que nous l'avons déjà trouvé
dans le code. Ainsi, si nous créions une
fonction pour cela, nous répéterions le
travail que nous avons déjà fait, ce qui serait inefficace. OK, donc
regardons le code afin où nous avons déjà
effectué ce calcul. abord, avant même d'
entrer dans la boucle d'entraînement, nous allons créer
deux nouvelles variables. Nous avons des disques Min,
au pluriel, qui sont un tableau
qui stockera les distances minimales
pour les n échantillons. Ensuite, nous avons une liste
pour stocker les coûts. Il s'agit d'une liste et non d'un tableau car le nombre d'
itérations est variable. Cela va donc stocker
le coût à chaque itération. OK, donc dans la boucle, examinons attentivement l'étape numéro un. Vous remarquerez que
nous faisons deux boucles, l'une sur les n points de données
et l'autre sur les k clusters. Pour chacun des k clusters,
nous calculons la racine carrée de la distance euclidienne entre la moyenne de l'agrégat, le nième point de données. De plus, vous vous
souviendrez que nous stockons cela dans une variable
appelée min dist. C'est exactement ce dont
nous avons besoin pour le coût. Par conséquent, tout ce que nous avons à faire,
c'est que notre boucle interne soit complète. Enregistrez simplement le disque Men dans
la matrice de disques minimum. Une fois la première étape terminée, nous avons maintenant tous les disques N Min, qui sont les distances
euclidiennes au carré entre chaque point de données et le centre de cluster le
plus proche. Comme vous le savez, le coût total n'
est que la somme de ces éléments. Par conséquent, nous appelons
la fonction Sum sur les hommes ainsi pour obtenir le coût, et nous l'enregistrons dans
notre liste de voitures. Après cela, le reste
du code est le même. Ainsi, une fois la formation terminée, nous pouvons appeler plt.plot pour tracer
le coût par itération. Comme vous pouvez le constater, le coût par itération
diminue à chaque itération et finit par converger vers une valeur minimale, comme promis. Et encore une fois,
rappelons-nous pourquoi c'est important. C'est important de
le faire chaque fois que vous
entraînez un modèle à l'aide
d'un algorithme itératif. Cela implique généralement de minimiser ou de maximiser certains objectifs. Par conséquent, vous
souhaitez tracer cet objectif à chaque itération pour vérifier que votre code
fonctionne comme prévu. En fait, parfois, comme
dans le deep learning, même si votre code est correct, les choses peuvent tout de même échouer en raison d' une sélection sous-optimale
des hyperparamètres. C'est donc une autre
raison pour laquelle vous devez tracer le coût par itération. Si ce n'est pas le cas, vous ne savez pas si votre modèle
a appris ce qu'il était censé apprendre simplement parce que votre
code est correct. Cela ne signifie pas que les
hyperparamètres que vous avez choisis sont également corrects. La leçon à tirer est que chaque fois que vous avez un algorithme itératif, il est toujours important de
tracer le coût par itération.