{"id":23427,"date":"2023-09-25T09:30:00","date_gmt":"2023-09-25T07:30:00","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=23427"},"modified":"2023-09-25T12:02:06","modified_gmt":"2023-09-25T10:02:06","slug":"introduzione-alle-tecniche-di-clustering","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/","title":{"rendered":"Apprendimento Non Supervisionato in Python: Una Introduzione alle Tecniche di Clustering per Scoprire i Pattern"},"content":{"rendered":"\n<p>L&#8217;apprendimento non supervisionato \u00e8 una tecnica di machine learning che non \u00e8 guidata dagli esseri umani.<\/p>\n\n\n\n<p>Nell&#8217;apprendimento supervisionato, i data scientists raccolgono i dati da una fonte. Questi dati sono etichettati, il che significa che i data scientists li utilizzano per fare previsioni. In altre parole, conoscono la risposta corretta a cui un modello di machine learning deve arrivare, quindi valutano quanto sia buono quel modello nel raggiungere la risposta corretta.<\/p>\n\n\n\n<p>Quindi, nell&#8217;apprendimento supervisionato, i data scientists utilizzano i dati che hanno per addestrare modelli di machine learning in modo tale che possano fare previsioni accurate su dati che il modello non ha mai visto prima.<\/p>\n\n\n\n<p>L&#8217;apprendimento non supervisionato, invece, funziona con un processo diverso. C&#8217;\u00e8 comunque un intervento umano, ovviamente. Ad esempio, per raccogliere e pulire i dati. Tuttavia, i data scientists utilizzano l&#8217;apprendimento non supervisionato per esplorare la struttura dei loro dati ed estrarre informazioni significative da essi.<\/p>\n\n\n\n<p>Ci sono due tipi di apprendimento non supervisionato:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Clustering.<\/li>\n\n\n\n<li>Riduzione della dimensionalit\u00e0.<\/li>\n<\/ul>\n\n\n\n<p>Questo articolo \u00e8 un&#8217;introduzione all&#8217;analisi dei gruppi&nbsp; per trovare informazioni significative nei dati.<\/p>\n\n\n\t\t\t\t<div class=\"wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-8d951074      \"\n\t\t\t\t\tdata-scroll= \"1\"\n\t\t\t\t\tdata-offset= \"30\"\n\t\t\t\t\tstyle=\"\"\n\t\t\t\t>\n\t\t\t\t<div class=\"uagb-toc__wrap\">\n\t\t\t\t\t\t<div class=\"uagb-toc__title\">\n\t\t\t\t\t\t\tIndice\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"uagb-toc__list-wrap \">\n\t\t\t\t\t\t<ol class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#introduzione-allanalisi-per-cluster\" class=\"uagb-toc-link__trigger\">Introduzione all\u2019analisi per cluster<\/a><li class=\"uagb-toc__list\"><a href=\"#unintroduzione-ai-popolari-algoritmi-in-python\" class=\"uagb-toc-link__trigger\">Un&#039;introduzione ai popolari algoritmi in Python<\/a><ul class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#k-means-clustering\" class=\"uagb-toc-link__trigger\">K-Means clustering<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#hierarchical-clustering\" class=\"uagb-toc-link__trigger\">Hierarchical clustering<\/a><\/li><\/ul><\/li><li class=\"uagb-toc__list\"><a href=\"#conclusioni\" class=\"uagb-toc-link__trigger\">Conclusioni<\/a><\/ul><\/ol>\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\n\n\n<h2 class=\"gb-headline gb-headline-094e8693 gb-headline-text\">Introduzione all\u2019analisi per cluster<\/h2>\n\n\n\n<p>E&#8217; una tecnica di <a href=\"https:\/\/www.codemotion.com\/magazine\/it\/data-science-it\/analisi-dei-dati-pandas\/\">esplorazione dei dati<\/a> &#8211; spesso chiamata tecnica di pattern discovery &#8211; che ci consente di organizzare i dati in sottoinsiemi significativi &#8211; chiamati clusters &#8211;&nbsp; senza avere conoscenza preventiva dell&#8217;appartenenza dei dati a gruppi specifici.<\/p>\n\n\n\n<p>Dal punto di vista pratico, alimentiamo un modello di machine learning con i dati che abbiamo e esso sar\u00e0 in grado di individuare le connessioni significative tra i dati, consentendo la suddivisione in sottogruppi.<\/p>\n\n\n\n<p>Ecco come una tecnica mostrerebbe i cluster su un dato insieme di dati:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"489\" height=\"387\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/1-clusters.png\" alt=\"\" class=\"wp-image-23429\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/1-clusters.png 489w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/1-clusters-300x237.png 300w\" sizes=\"auto, (max-width: 489px) 100vw, 489px\" \/><figcaption class=\"wp-element-caption\"><em>&nbsp;Un set di dati diviso in cluster. Immagine dell\u2019Autore.<\/em><\/figcaption><\/figure>\n\n\n\n<p>L&#8217;immagine sopra mostra che l&#8217;algoritmo ha individuato tre cluster nell&#8217;insieme di dati fornito e li rappresenta con colori differenti.<\/p>\n\n\n\n<p>Quindi, ciascun cluster che emerge durante l&#8217;analisi definisce un gruppo di oggetti che condividono un certo grado di somiglianza. Questi oggetti sono anche dissimili dagli oggetti presenti negli altri cluster, ed \u00e8 per questo che si tratta di un processo non supervisionato.<\/p>\n\n\n\n<p>Pertanto, l&#8217;analisi \u00e8 un\u2019ottima metodologia per strutturare le informazioni e significative presenti nei dati.<\/p>\n\n\n\n<p>In particolare, pu\u00f2 essere utilizzata con una moltitudine di obiettivi in mente. Ad esempio, pu\u00f2 essere utilizzata dai marketer per scoprire gruppi di clienti basati sui loro interessi.<\/p>\n\n\n\n<p>Oppure, pu\u00f2 anche essere utilizzata dai data scientists per definire le labels di un dataset da utilizzare per fare predizioni. In altre parole, ci sono casi in cui le labels non sono chiare o sono sconosciute e possiamo utilizzarlo per definirle.<\/p>\n\n\n\n<p>Le tecniche di &nbsp;analisi dei gruppi tipiche sono:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>K-means.<\/li>\n\n\n\n<li>Hierarchical.<\/li>\n\n\n\n<li>DBSCAN.<\/li>\n<\/ul>\n\n\n\n<p>Questo articolo si concentra sui primi due.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Lettura consigliata: <em><a href=\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/sviluppo-chatbot-con-python\/\" class=\"ek-link\">Come sviluppare il tuo Chatbot con Python e ChatterBot partendo da zero<\/a><\/em><\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"gb-headline gb-headline-844a5f26 gb-headline-text\">Un&#8217;introduzione ai popolari algoritmi in Python<\/h2>\n\n\n\n<p>In questa sezione, descriveremo come funzionano il k-mean e lo hierarchical. Implementeremo anche esempi in <a href=\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/programmare-con-python\/\" class=\"ek-link\">Python<\/a> per mostrare come usarli.<\/p>\n\n\n\n<h3 class=\"gb-headline gb-headline-a4608efd gb-headline-text\">K-Means clustering<\/h3>\n\n\n\n<p>L&#8217;algoritmoin questione appartiene a una categoria chiamata<strong> basata su prototipi<\/strong>.<\/p>\n\n\n\n<p>In questa categoria, un cluster \u00e8 rappresentato come un prototipo, che di solito \u00e8 il centroide (la media) dei punti simili nel caso di caratteristiche continue, o il medoide (il pi\u00f9 rappresentativo o il punto che minimizza la distanza da tutti gli altri punti che appartengono a un cluster specifico) nel caso di caratteristiche categoriche.<\/p>\n\n\n\n<p>L&#8217;algoritmo \u00e8 molto efficace nell&#8217;identificare clusters con una forma sferica, ma uno dei suoi svantaggi \u00e8 che dobbiamo specificare il numero di cluster, <em>k<\/em>, in anticipo.<\/p>\n\n\n\n<p>Una non corretta di <em>k<\/em> pu\u00f2 portare a una scarsa performance dell&#8217;analisi dei gruppi&nbsp;, ma esistono metodi per valutare la qualit\u00e0 di un cluster che ci aiutano a determinare il numero ottimale di cluster, <em>k<\/em>.<\/p>\n\n\n\n<p>Quando ci riferiamo alla &#8220;forma sferica&#8221; di un cluster, intendiamo che i punti dati all&#8217;interno di un cluster sono distribuiti in modo simile a una sfera tridimensionale (o a un cerchio bidimensionale). In altre parole, i punti nel cluster sono strettamente raggruppati intorno a un punto centrale, e le distanze da questo punto centrale ai punti dati sono approssimativamente uguali in tutte le direzioni.<\/p>\n\n\n\n<p>Ecco come appare una distribuzione dei dati sferica e non sferica in due dimensioni:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"856\" height=\"352\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/2-spherical-non-spherical-clusters.png\" alt=\"\" class=\"wp-image-23430\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/2-spherical-non-spherical-clusters.png 856w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/2-spherical-non-spherical-clusters-300x123.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/2-spherical-non-spherical-clusters-768x316.png 768w\" sizes=\"auto, (max-width: 856px) 100vw, 856px\" \/><figcaption class=\"wp-element-caption\"><em>Distribuzione dei dati sferica e non sferica. Immagine dell&#8217;autore.<\/em><\/figcaption><\/figure>\n\n\n\n<p>L\u2019immagine sopra mostra che:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>I punti blu sono, in qualche modo, distribuiti con distanze speculari rispetto al centro della distribuzione (il centroide). Questo pu\u00f2 rappresentare un cluster sferico.<\/li>\n\n\n\n<li>I punti rossi non sono distribuiti con distanze speculari rispetto al centro della distribuzione (il centroide). Questo pu\u00f2 rappresentare un cluster non sferico.<\/li>\n<\/ul>\n\n\n\n<p>Ora vogliamo estendere il concetto legato alla distanza. L&#8217;esempio sopra mostra solo un cluster allo scopo di visualizzare una distribuzione sferica e una non sferica.<\/p>\n\n\n\n<p>Creiamo quindi un dataset composto da 150 punti generati casualmente raggruppati in tre sottogruppi. Possiamo usare il seguente codice per farlo:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from sklearn.datasets import make_blobs\nimport matplotlib.pyplot <span class=\"hljs-keyword\">as<\/span> plt\n\n<span class=\"hljs-comment\"># Create 3 clusters with 150 randomly generated data points and 2 features<\/span>\nX,y = make_blobs(n_samples=<span class=\"hljs-number\">150<\/span>, n_features=<span class=\"hljs-number\">2<\/span>, centers=<span class=\"hljs-number\">3<\/span>, cluster_std=<span class=\"hljs-number\">0.5<\/span>, shuffle=<span class=\"hljs-keyword\">True<\/span>, random_state=<span class=\"hljs-number\">0<\/span>)\n\n<span class=\"hljs-comment\"># Plot the points as a scatterplot<\/span>\nplt.scatter(X&#91;:,<span class=\"hljs-number\">0<\/span>], X&#91;:, <span class=\"hljs-number\">1<\/span>], c=<span class=\"hljs-string\">\"white\"<\/span>, marker=<span class=\"hljs-string\">\"o\"<\/span>, edgecolor=<span class=\"hljs-string\">\"black\"<\/span>, s=<span class=\"hljs-number\">50<\/span>)\n\n<span class=\"hljs-comment\"># Write labels, show grid and plot<\/span>\nplt.xlabel(<span class=\"hljs-string\">\"Feature 1\"<\/span>)\nplt.ylabel(<span class=\"hljs-string\">\"Feature 2\"<\/span>)\nplt.grid()\nplt.tight_layout()\nplt.show()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Otteniamo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"424\" height=\"280\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/3-randomly-generated-data-for-3-clusters.png\" alt=\"\" class=\"wp-image-23431\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/3-randomly-generated-data-for-3-clusters.png 424w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/3-randomly-generated-data-for-3-clusters-300x198.png 300w\" sizes=\"auto, (max-width: 424px) 100vw, 424px\" \/><figcaption class=\"wp-element-caption\"><em>Una distribuzione dati a tre cluster. Immagine dell&#8217;autore.<\/em><\/figcaption><\/figure>\n\n\n\n<p>Ora, nelle applicazioni reali, non sappiamo in quanti cluster possono essere suddivisi i dati, che \u00e8 il valore k che dobbiamo trovare, come abbiamo detto prima. Per fare ci\u00f2, possiamo seguire questi passaggi:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Scegli <em>k<\/em> centroidi casuali dagli esempi come centri iniziali del cluster.<\/li>\n\n\n\n<li>Assegna ogni esempio al centroide pi\u00f9 vicino \ud835\udf07<sup>(i)<\/sup>,j \u220a [1,&#8230;,k]<\/li>\n\n\n\n<li>Sposta i centroidi al centro degli esempi che gli sono stati assegnati.<\/li>\n\n\n\n<li>Ripeti i passaggi 2 e 3 finch\u00e9 le assegnazioni dei cluster non cambiano o non viene raggiunta una tolleranza definita dall&#8217;utente o un numero massimo di iterazioni.<\/li>\n<\/ol>\n\n\n\n<p>Ora, come misuriamo la similarit\u00e0 tra oggetti?<\/p>\n\n\n\n<p>Se stessimo valutando i colori di alcune auto, ad esempio, l&#8217;occhio umano potrebbe dire che un&#8217;auto arancione sia simile ad una rossa. Ma come possiamo definire la similarit\u00e0 in matematica?<\/p>\n\n\n\n<p>Possiamo definire la similarit\u00e0 come l&#8217;opposto della distanza. Una metrica di distanza, infatti, quantifica la dissimilarit\u00e0 o la distanza tra due punti dati. Pi\u00f9 \u00e8 piccola la distanza tra due punti, pi\u00f9 questi sono simili. Pi\u00f9 \u00e8 grande la distanza, meno sono simili.<\/p>\n\n\n\n<p>Quindi, in questo senso, &#8220;similarit\u00e0&#8221; e &#8220;distanza&#8221; sono inversamente correlati: una distanza pi\u00f9 piccola implica una maggiore similarit\u00e0, mentre una distanza pi\u00f9 grande implica una minore similarit\u00e0.<\/p>\n\n\n\n<p>Una distanza comunemente utilizzata nell&#8217;analisi dei gruppi&nbsp;con feature continue \u00e8 la distanza Euclidea al quadrato tra due punti, x e y:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"425\" height=\"134\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/4-Euclidean-distance-formula.png\" alt=\"\" class=\"wp-image-23432\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/4-Euclidean-distance-formula.png 425w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/4-Euclidean-distance-formula-300x95.png 300w\" sizes=\"auto, (max-width: 425px) 100vw, 425px\" \/><figcaption class=\"wp-element-caption\"><em>La formula della distanza Euclidea. Immagine dell\u2019autore.<\/em><\/figcaption><\/figure>\n\n\n\n<p>Quindi, sulla base di questa metrica, pu\u00f2 essere descritto come un problema di ottimizzazione: \u00e8 un algoritmo iterativo che minimizza la somma degli errori quadratici all\u2019interno di un cluster.<\/p>\n\n\n\n<p>Per semplicit\u00e0, non andiamo oltre con la matematica in questo articolo.&nbsp;<\/p>\n\n\n\n<p>Proseguiamo implementando un algoritmo in Python:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import numpy <span class=\"hljs-keyword\">as<\/span> np\nimport matplotlib.pyplot <span class=\"hljs-keyword\">as<\/span> plt\nfrom sklearn.datasets import make_classification\nfrom sklearn.cluster import KMeans\n\n<span class=\"hljs-comment\"># Generate data<\/span>\nX, y = make_classification(n_samples=<span class=\"hljs-number\">1000<\/span>, n_features=<span class=\"hljs-number\">20<\/span>, random_state=<span class=\"hljs-number\">42<\/span>)\n\n<span class=\"hljs-comment\"># Create a K-Means clustering model<\/span>\nkmeans = KMeans(n_clusters=<span class=\"hljs-number\">3<\/span>, random_state=<span class=\"hljs-number\">42<\/span>)\n\n<span class=\"hljs-comment\"># Fit the model to your data<\/span>\ncluster_labels = kmeans.fit_predict(X)\n\n<span class=\"hljs-comment\"># Create a scatter plot for the first two features<\/span>\nplt.figure(figsize=(<span class=\"hljs-number\">8<\/span>, <span class=\"hljs-number\">6<\/span>))\nplt.scatter(X&#91;:, <span class=\"hljs-number\">0<\/span>], X&#91;:, <span class=\"hljs-number\">1<\/span>], c=cluster_labels, cmap=<span class=\"hljs-string\">'viridis'<\/span>)\nplt.xlabel(<span class=\"hljs-string\">'Feature 1'<\/span>)\nplt.ylabel(<span class=\"hljs-string\">'Feature 2'<\/span>)\nplt.title(<span class=\"hljs-string\">'Data with Clusters'<\/span>)\nplt.colorbar(label=<span class=\"hljs-string\">'Cluster'<\/span>)\nplt.show()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>E otteniamo l&#8217;immagine che abbiamo visto all&#8217;inizio dell&#8217;articolo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"489\" height=\"387\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/1-clusters.png\" alt=\"\" class=\"wp-image-23429\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/1-clusters.png 489w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/1-clusters-300x237.png 300w\" sizes=\"auto, (max-width: 489px) 100vw, 489px\" \/><figcaption class=\"wp-element-caption\"><em>Un dataset diviso in 3 clusters. Immagine dell\u2019autore.<\/em><\/figcaption><\/figure>\n\n\n\n<p>Dunque, con <strong>from<\/strong> sklearn.cluster <strong>import<\/strong> KMeans importiamo il modello k-means da sklearn. Poi, possiamo gestire il numero di cluster modificando il parametro n_clusters.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Lettura consigliata: <em><a href=\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/guida-librerie-python-data-science\/\" class=\"ek-link\">Librerie Python per Data Science: una guida completa<\/a><\/em><\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"gb-headline gb-headline-cb7567a6 gb-headline-text\">Hierarchical clustering<\/h3>\n\n\n\n<p>E&#8217; una tecnica utilizzata per raggruppare i punti dati in cluster nidificati o in una struttura gerarchica. \u00c8 particolarmente utile quando vogliamo esplorare l&#8217;organizzazione dei dati a vari livelli di granularit\u00e0.<\/p>\n\n\n\n<p>Due grandi vantaggi dello hierarchical sono:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La possibilit\u00e0 di tracciare il dendrogramma. Questa \u00e8 la visualizzazione di binario e pu\u00f2 aiutare con l&#8217;interpretazione dei risultati.<\/li>\n\n\n\n<li>Non \u00e8 necessario specificare il numero di cluster.<\/li>\n<\/ul>\n\n\n\n<p>I due principali approcci sono:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Agglomerative<\/strong>. Iniziamo con ogni esempio come un singolo cluster e uniamo le coppie di cluster pi\u00f9 vicine finch\u00e9 non rimane un solo cluster.<\/li>\n\n\n\n<li><strong>Divisive<\/strong>.&nbsp;<\/li>\n\n\n\n<li>Iniziamo con un cluster che comprende il set di dati completo e dividiamo iterativamente il cluster in cluster pi\u00f9 piccoli finch\u00e9 ciascun cluster non contiene un solo esempio.<\/li>\n<\/ul>\n\n\n\n<p>In questo articolo, considereremo l\u2019agglomerative.<\/p>\n\n\n\n<p>I due algoritmi standard per l\u2019agglomerative sono:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&nbsp;<strong>Single linkage<\/strong>. Questo calcola le distanze tra i membri pi\u00f9 simili di ciascuna coppia di cluster e unisce i due cluster per i quali la distanza tra i membri pi\u00f9 simili \u00e8 la pi\u00f9 piccola.<\/li>\n\n\n\n<li><strong>Complete linkage<\/strong>. Invece di confrontare i membri pi\u00f9 simili, confronta quelli pi\u00f9 dissimili per eseguire l&#8217;unione.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"656\" height=\"332\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/5-agglomerative-hierachicahl-clustering.png\" alt=\"\" class=\"wp-image-23433\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/5-agglomerative-hierachicahl-clustering.png 656w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/5-agglomerative-hierachicahl-clustering-300x152.png 300w\" sizes=\"auto, (max-width: 656px) 100vw, 656px\" \/><figcaption class=\"wp-element-caption\"><em>Visualizzazione dei concetti alla base dello agglomerative hierarchical. Immagine dell\u2019autore.<\/em><\/figcaption><\/figure>\n\n\n\n<p>Implementiamo un agglomerative hierarchical con l\u2019approccio complete linkage in Python:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import numpy <span class=\"hljs-keyword\">as<\/span> np\nfrom scipy.cluster.hierarchy import linkage, dendrogram\nimport matplotlib.pyplot <span class=\"hljs-keyword\">as<\/span> plt\n\n<span class=\"hljs-comment\"># Create a synthetic dataset with 20 features and 200 data points<\/span>\nnp.random.seed(<span class=\"hljs-number\">0<\/span>)\nX = np.random.rand(<span class=\"hljs-number\">200<\/span>, <span class=\"hljs-number\">20<\/span>)\n\n<span class=\"hljs-comment\"># Perform hierarchical clustering with complete linkage<\/span>\nlinkage_matrix = linkage(X, method=<span class=\"hljs-string\">'complete'<\/span>, metric=<span class=\"hljs-string\">'euclidean'<\/span>)\n\n<span class=\"hljs-comment\"># Plot the dendrogram<\/span>\nplt.figure(figsize=(<span class=\"hljs-number\">12<\/span>, <span class=\"hljs-number\">6<\/span>))\ndendrogram(linkage_matrix, truncate_mode=<span class=\"hljs-string\">'lastp'<\/span>, p=<span class=\"hljs-number\">20<\/span>, leaf_rotation=<span class=\"hljs-number\">90.<\/span>, leaf_font_size=<span class=\"hljs-number\">8.<\/span>, show_contracted=<span class=\"hljs-keyword\">True<\/span>)\nplt.title(<span class=\"hljs-string\">'Hierarchical Clustering Dendrogram with Complete Linkage'<\/span>)\nplt.xlabel(<span class=\"hljs-string\">'Data Points'<\/span>)\nplt.ylabel(<span class=\"hljs-string\">'Distance'<\/span>)\nplt.show()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Abbiamo creato un dataset con 200 punti creati randomicamente e 20 features con il metodo np.random.rand(). Poi abbiamo creato lo hierarchical cluster con li metodo linkage() dalla libreria SciPy.<\/p>\n\n\n\n<p>Dal codice sopra otteniamo il seguente dendrogramma:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"393\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/6-the-dendrogram.png\" alt=\"\" class=\"wp-image-23434\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/6-the-dendrogram.png 720w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/6-the-dendrogram-300x164.png 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><figcaption class=\"wp-element-caption\"><em>Il dendrogramma risultante. Immagine dell&#8217;autore.<\/em><\/figcaption><\/figure>\n\n\n\n<p>Quindi, un dendrogramma \u00e8 un diagramma ad albero utilizzato per visualizzare le relazioni tra i punti dati in un dataset. In particolare, ci mostra la gerarchia di come i punti dati siano raggruppati in base alla loro somiglianza.<\/p>\n\n\n\n<p>Ecco come interpretare il dendrogramma ottenuto nell&#8217;esempio sopra:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Linee verticali(<strong>Branches<\/strong>). Inizialmente rappresentano punti dati individuali. Man mano che saliamo nel dendrogramma, queste linee iniziano a fondersi in gruppi.<\/li>\n\n\n\n<li>Linee orizzontali (<strong>Links<\/strong>). Le linee orizzontali che collegano le linee verticali rappresentano l\u2019unione dei cluster. L&#8217;altezza di queste linee corrisponde alla dissomiglianza tra i cluster uniti. Pi\u00f9 alta \u00e8 la linea, maggiore \u00e8 la dissomiglianza tra i cluster da unire.<\/li>\n\n\n\n<li><strong>Clusters<\/strong>. Le foglie del dendrogramma rappresentano i punti presi singolarmente. Man mano che saliamo nel dendrogramma, i cluster si formano unendo punti dati o cluster pi\u00f9 piccoli. I rami nella parte inferiore del dendrogramma rappresentano il livello pi\u00f9 alto di &nbsp;analisi dei gruppi (singoli punti dati), mentre i rami ai livelli pi\u00f9 alti rappresentano cluster pi\u00f9 grandi formati unendo quelli pi\u00f9 piccoli.<\/li>\n\n\n\n<li>Tagliare il dendrogramma. Per determinare il numero di cluster, possiamo tracciare una linea orizzontale (chiamata &#8220;taglio&#8221;) ad una certa altezza sul dendrogramma. Il numero di cluster \u00e8 determinato dal numero di volte in cui la linea orizzontale interseca le linee verticali. Ogni punto di intersezione corrisponde ad un cluster.<\/li>\n<\/ol>\n\n\n\n<p>Possiamo tagliare un dendrogramma tenendo a mente le seguenti idee:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se tagliamo il dendrogramma ad alto livello (linea orizzontale alta), otteniamo un numero minore di cluster pi\u00f9 grandi, che sono pi\u00f9 dissimili tra loro.<\/li>\n\n\n\n<li>Se tagliamo il dendrogramma ad un livello pi\u00f9 basso (breve linea orizzontale), otteniamo un numero maggiore di cluster pi\u00f9 piccoli e pi\u00f9 simili tra loro.<\/li>\n<\/ul>\n\n\n\n<p>Nel nostro caso, vogliamo quelli pi\u00f9 dissimili poich\u00e9 utilizziamo il metodo complete linkage.&nbsp;<\/p>\n\n\n\n<p>Possiamo, quindi, sceglierne tre come numero per i cluster.<\/p>\n\n\n\n<p>Ora possiamo usare scikit-learn per applicare un agglomerative hierarchical cluster con 3 cluster:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import numpy <span class=\"hljs-keyword\">as<\/span> np\nfrom scipy.cluster.hierarchy import linkage, dendrogram\nfrom sklearn.cluster import AgglomerativeClustering\nimport matplotlib.pyplot <span class=\"hljs-keyword\">as<\/span> plt\n\n<span class=\"hljs-comment\"># Create dataset with 20 features and 200 data points<\/span>\nnp.random.seed(<span class=\"hljs-number\">0<\/span>)\nX = np.random.rand(<span class=\"hljs-number\">200<\/span>, <span class=\"hljs-number\">20<\/span>)\n\n<span class=\"hljs-comment\"># Perform hierarchical clustering with complete linkage<\/span>\nlinkage_matrix = linkage(X, method=<span class=\"hljs-string\">'complete'<\/span>, metric=<span class=\"hljs-string\">'euclidean'<\/span>)\n\n<span class=\"hljs-comment\"># Specify the desired number of clusters<\/span>\nn_clusters = <span class=\"hljs-number\">3<\/span>\n\n<span class=\"hljs-comment\"># Create an Agglomerative Clustering model<\/span>\nagg_cluster = AgglomerativeClustering(n_clusters=n_clusters)\n\n<span class=\"hljs-comment\"># Fit the model to the data and get cluster labels<\/span>\ncluster_labels = agg_cluster.fit_predict(X)\n\n<span class=\"hljs-comment\"># Plot the data with cluster labels<\/span>\nplt.scatter(X&#91;:, <span class=\"hljs-number\">0<\/span>], X&#91;:, <span class=\"hljs-number\">1<\/span>], c=cluster_labels, cmap=<span class=\"hljs-string\">'viridis'<\/span>)\nplt.title(f<span class=\"hljs-string\">'Agglomerative Clustering with {n_clusters} Clusters'<\/span>)\nplt.xlabel(<span class=\"hljs-string\">'Feature 1'<\/span>)\nplt.ylabel(<span class=\"hljs-string\">'Feature 2'<\/span>)\nplt.colorbar(label=<span class=\"hljs-string\">'Cluster'<\/span>)\nplt.show()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>E otteniamo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"390\" height=\"278\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/7-agglomerative-cluster-with-three-clusters.png\" alt=\"\" class=\"wp-image-23435\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/7-agglomerative-cluster-with-three-clusters.png 390w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/7-agglomerative-cluster-with-three-clusters-300x214.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/09\/7-agglomerative-cluster-with-three-clusters-180x128.png 180w\" sizes=\"auto, (max-width: 390px) 100vw, 390px\" \/><figcaption class=\"wp-element-caption\"><em>Il cluster agglomerativo con tre clusters. Immagine dell\u2019autore.<\/em><\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Lettura consigliata: <em><a href=\"https:\/\/www.codemotion.com\/magazine\/it\/data-science-it\/python-e-databricks-la-giusta-accoppiata-per-dominare-i-dati\/\" class=\"ek-link\">Python e DataBricks: la giusta accoppiata per dominare i dati<\/a><\/em><\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"gb-headline gb-headline-17a8e401 gb-headline-text\">Conclusioni<\/h2>\n\n\n\n<p>In questo articolo, abbiamo descritto una tecnica di apprendimento non supervisionato.<\/p>\n\n\n\n<p>Abbiamo anche mostrato due metodologie diverse con implementazioni in Python:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>K-means.<\/li>\n\n\n\n<li>Hierarchical.<\/li>\n<\/ul>\n\n\n\n<p>Queste sono le metodologie giuste per trovare strutture nascoste e connessioni tra i dati durante la fase di analisi esplorativa dei dati.<\/p>\n\n\n\n<p>Fonti:<\/p>\n\n\n\n<p>[1] Machine Learning With PyTorch and Scikit-Learn &#8211; Sebastian Raschka, Yuxi Liu, Vahid Mirjalili<\/p>\n\n\n<p><script src=\"https:\/\/codemotion.activehosted.com\/f\/embed.php?id=42\" type=\"text\/javascript\" charset=\"utf-8\"><\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&#8217;apprendimento non supervisionato \u00e8 una tecnica di machine learning che non \u00e8 guidata dagli esseri umani. Nell&#8217;apprendimento supervisionato, i data scientists raccolgono i dati da una fonte. Questi dati sono etichettati, il che significa che i data scientists li utilizzano per fare previsioni. In altre parole, conoscono la risposta corretta a cui un modello di&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/\">Read more<\/a><\/p>\n","protected":false},"author":171,"featured_media":22665,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10230],"tags":[],"collections":[],"class_list":{"0":"post-23427","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-linguaggi-programmazione","8":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Introduzione alle Tecniche di Clustering in Python<\/title>\n<meta name=\"description\" content=\"Questo articolo \u00e8 un&#039;introduzione all&#039;analisi del clustering per trovare informazioni significative nei dati.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Apprendimento Non Supervisionato in Python: Una Introduzione alle Tecniche di Clustering per Scoprire i Pattern\" \/>\n<meta property=\"og:description\" content=\"Questo articolo \u00e8 un&#039;introduzione all&#039;analisi del clustering per trovare informazioni significative nei dati.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-25T07:30:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-25T10:02:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1253\" \/>\n\t<meta property=\"og:image:height\" content=\"836\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Federico Trotta\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Federico Trotta\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/\"},\"author\":{\"name\":\"Federico Trotta\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/98d2abaf70e7d106abab1f38bf20f90d\"},\"headline\":\"Apprendimento Non Supervisionato in Python: Una Introduzione alle Tecniche di Clustering per Scoprire i Pattern\",\"datePublished\":\"2023-09-25T07:30:00+00:00\",\"dateModified\":\"2023-09-25T10:02:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/\"},\"wordCount\":1776,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg\",\"articleSection\":[\"Linguaggi di programmazione\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/\",\"name\":\"Introduzione alle Tecniche di Clustering in Python\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg\",\"datePublished\":\"2023-09-25T07:30:00+00:00\",\"dateModified\":\"2023-09-25T10:02:06+00:00\",\"description\":\"Questo articolo \u00e8 un'introduzione all'analisi del clustering per trovare informazioni significative nei dati.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg\",\"width\":1253,\"height\":836,\"caption\":\"Script coding and programming in php, python, javascript, other languages. Cartoon professional programmer working with laptop online among windows and programs flat vector illustration. Code concept\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Linguaggi di programmazione\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Apprendimento Non Supervisionato in Python: Una Introduzione alle Tecniche di Clustering per Scoprire i Pattern\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/98d2abaf70e7d106abab1f38bf20f90d\",\"name\":\"Federico Trotta\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/69bc8655986054bfe43c7eaa7f00e2ea939b761bd924064ea9b5972568a01714?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/69bc8655986054bfe43c7eaa7f00e2ea939b761bd924064ea9b5972568a01714?s=96&d=mm&r=g\",\"caption\":\"Federico Trotta\"},\"description\":\"I have loved writing since I was a young boy in school, writing detective stories as class exams. Thanks to my curiosity, I discovered programming and AI. Having a burning passion for writing, I couldn't avoid starting to write about these topics, so I decided to change my career to become a Technical Writer. My purpose is to educate people on Python programming, Machine Learning, and Data Science, through writing.\",\"sameAs\":[\"https:\/\/federicotrotta.com\/\",\"https:\/\/www.linkedin.com\/in\/federico-trotta\/?originalSubdomain=it\"],\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/federico-trotta\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introduzione alle Tecniche di Clustering in Python","description":"Questo articolo \u00e8 un'introduzione all'analisi del clustering per trovare informazioni significative nei dati.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/","og_locale":"en_US","og_type":"article","og_title":"Apprendimento Non Supervisionato in Python: Una Introduzione alle Tecniche di Clustering per Scoprire i Pattern","og_description":"Questo articolo \u00e8 un'introduzione all'analisi del clustering per trovare informazioni significative nei dati.","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2023-09-25T07:30:00+00:00","article_modified_time":"2023-09-25T10:02:06+00:00","og_image":[{"width":1253,"height":836,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg","type":"image\/jpeg"}],"author":"Federico Trotta","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Federico Trotta","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/"},"author":{"name":"Federico Trotta","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/98d2abaf70e7d106abab1f38bf20f90d"},"headline":"Apprendimento Non Supervisionato in Python: Una Introduzione alle Tecniche di Clustering per Scoprire i Pattern","datePublished":"2023-09-25T07:30:00+00:00","dateModified":"2023-09-25T10:02:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/"},"wordCount":1776,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg","articleSection":["Linguaggi di programmazione"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/","name":"Introduzione alle Tecniche di Clustering in Python","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg","datePublished":"2023-09-25T07:30:00+00:00","dateModified":"2023-09-25T10:02:06+00:00","description":"Questo articolo \u00e8 un'introduzione all'analisi del clustering per trovare informazioni significative nei dati.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg","width":1253,"height":836,"caption":"Script coding and programming in php, python, javascript, other languages. Cartoon professional programmer working with laptop online among windows and programs flat vector illustration. Code concept"},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/introduzione-alle-tecniche-di-clustering\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Linguaggi di programmazione","item":"https:\/\/www.codemotion.com\/magazine\/it\/linguaggi-programmazione\/"},{"@type":"ListItem","position":3,"name":"Apprendimento Non Supervisionato in Python: Una Introduzione alle Tecniche di Clustering per Scoprire i Pattern"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/98d2abaf70e7d106abab1f38bf20f90d","name":"Federico Trotta","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/69bc8655986054bfe43c7eaa7f00e2ea939b761bd924064ea9b5972568a01714?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/69bc8655986054bfe43c7eaa7f00e2ea939b761bd924064ea9b5972568a01714?s=96&d=mm&r=g","caption":"Federico Trotta"},"description":"I have loved writing since I was a young boy in school, writing detective stories as class exams. Thanks to my curiosity, I discovered programming and AI. Having a burning passion for writing, I couldn't avoid starting to write about these topics, so I decided to change my career to become a Technical Writer. My purpose is to educate people on Python programming, Machine Learning, and Data Science, through writing.","sameAs":["https:\/\/federicotrotta.com\/","https:\/\/www.linkedin.com\/in\/federico-trotta\/?originalSubdomain=it"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/federico-trotta\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript-600x400.jpg","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript-600x600.jpg","author_info":{"display_name":"Federico Trotta","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/federico-trotta\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg",1253,836,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript-150x150.jpg",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript-300x200.jpg",300,200,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript-768x512.jpg",768,512,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript-1024x683.jpg",1024,683,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg",1253,836,false],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg",1253,836,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript.jpg",100,67,false],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript-180x128.jpg",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript-896x504.jpg",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript-400x225.jpg",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript-600x400.jpg",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/08\/Color-Manipulation-Library-for-JavaScript-600x600.jpg",600,600,true]},"uagb_author_info":{"display_name":"Federico Trotta","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/federico-trotta\/"},"uagb_comment_info":0,"uagb_excerpt":"L&#8217;apprendimento non supervisionato \u00e8 una tecnica di machine learning che non \u00e8 guidata dagli esseri umani. Nell&#8217;apprendimento supervisionato, i data scientists raccolgono i dati da una fonte. Questi dati sono etichettati, il che significa che i data scientists li utilizzano per fare previsioni. In altre parole, conoscono la risposta corretta a cui un modello di&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/23427","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/171"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=23427"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/23427\/revisions"}],"predecessor-version":[{"id":23460,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/23427\/revisions\/23460"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/22665"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=23427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=23427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=23427"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=23427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}