Como visualizar os clusters em um k-médias modelo de aprendizagem não supervisionada
O conjunto de dados Iris não é fácil para o gráfico de análise preditiva em sua forma original. Portanto, você tem que reduzir o número de dimensões, aplicando um algoritmo de redução de dimensionalidade
que opera em todos os quatro números e gera dois novos números (que representam os quatro números originais) que você pode usar para fazer a trama.Video: Algoritmo K-Médias ou K-Means
sepal Comprimento | sepal Largura | Comprimento pétala | pétala Largura | Classe Alvo / etiqueta |
---|---|---|---|---|
5.1 | 3,5 | 1,4 | 0,2 | Setosa (0) |
7 | 3.2 | 4.7 | 1,4 | Versicolor (1) |
6,3 | 3,3 | 6 | 2,5 | Virginica (2) |
O código a seguir fará a redução dimensão:
gt; gt; gt; de sklearn.decomposition PCAgt importação; gt; gt; de sklearn.datasets importar load_irisgt; gt; gt; íris = load_iris () gt; gt; gt; pca = PCA (n_components = 2) .fit (iris.data) gt; gt; gt; pca_2d = pca.transform (iris.data)
Linhas 2 e 3 de carga do conjunto de dados Iris.
Depois de executar o código, você pode digitar o pca_2d variável para o intérprete e vai matrizes de saída (pense em um ordem como um recipiente de itens em uma lista) com dois itens em vez de quatro. Agora que você tem o conjunto de recursos reduzidos, você pode plotar os resultados com o seguinte código:
gt; gt; gt; importação Pylab como plgt; gt; gt; para i na gama (0, pca_2d.shape [0]): gt; gt; gt; se iris.target [i] == 0: gt; gt; gt; c1 = pl.scatter (pca_2d [i, 0], pca_2d [i, 1], c = r ``, marcador = `+`) gt; gt; gt; elif iris.target [i] == 1: gt; gt; gt; c2 = pl.scatter (pca_2d [i, 0], pca_2d [i, 1], c = `g`, marcador = `o`) gt; gt; gt; elif iris.target [i] == 2: gt; gt; gt; C3 = pl.scatter (pca_2d [i, 0], pca_2d [i, 1], c = `b`, marcador = `*`) gt; gt; gt; pl.legend ([C1, C2, C3], [ `setosa`, `versicolor`, `Virginica`]) gt; gt; gt; pl.title ( `Iris conjunto de dados com 3 clusters e knownoutcomes`); gt gt; gt; pl.show ()
A saída deste código é um gráfico que deve ser semelhante ao gráfico abaixo. Este é um gráfico que representa como os resultados conhecidos do conjunto de dados Iris deve ser parecida. É o que você gostaria que o agrupamento K-means para conseguir.
A imagem mostra um gráfico de dispersão, que é um gráfico de pontos traçados representando uma observação num gráfico, de todos os 150 observações. Como indicado nas parcelas gráfico e legenda:
Existem 50 vantagens que representam a setosa classe.
Há 50 círculos que representam a classe versicolor.
Há 50 estrelas que representam o classe virginica.
O gráfico abaixo mostra uma representação visual dos dados que estão a pedir K-means para agrupar: um gráfico de dispersão com 150 pontos de dados que não foram marcadas (por conseguinte, todos os pontos de dados são a mesma cor e forma). O K-means não sabe qualquer alvo outcomes- os dados reais que estamos executando através do algoritmo não teve sua dimensionalidade reduzida ainda.
A seguir linha de código cria este gráfico de dispersão, usando os valores de X e Y de pca_2d e colorir todos os pontos de dados preto (c =’preto’ define a cor para preto).
gt; gt; gt; pl.scatter (pca_2d [:, 0], pca_2d [:, 1], c = `preto`) gt; gt; gt; pl.show ()
Se você tentar ajuste dos dados bidimensionais, que foi reduzido em PCA, o K-means vai deixar de agrupar as classes Virginica e Versicolor corretamente. Usando PCA para pré-processar os dados irá destruir muita informação que K-significa necessidades.
Video: kmeans clustering algorithm part1
Depois de K-means equipou os dados Iris, você pode fazer um gráfico de dispersão dos aglomerados que o algoritmo produced- basta executar o seguinte código:
gt; gt; gt; para i na gama (0, pca_2d.shape [0]): gt; gt; gt; se kmeans.labels_ [i] == 1: gt; gt; gt; c1 = pl.scatter (pca_2d [i, 0], pca_2d [i, 1], c = r ``, marcador = `+`) gt; gt; gt; elif kmeans.labels_ [i] == 0: gt; gt; gt; c2 = pl.scatter (pca_2d [i, 0], pca_2d [i, 1], c = `g`, marcador = `o`) gt; gt; gt; elif kmeans.labels_ [i] == 2: gt; gt; gt; C3 = pl.scatter (pca_2d [i, 0], pca_2d [i, 1], c = `b`, marcador = `*`) gt; gt; gt; pl.legend ([C1, C2, C3], [ `Cluster 1`, `0 cluster`, `Cluster 2`]) gt; gt; gt; pl.title ( `K-means agrupamentos o conjunto de dados da íris em 3clusters`) gt; gt; gt; pl.show ()
Recorde-se que K-means marcado as primeiras 50 observações com o rótulo de 1, o segundo 50 com etiqueta de 0, eo último 50 com o rótulo de 2. No código acabado de dar, as linhas com o E se, elif, e lenda declarações (linhas 2, 5, 8, 11) reflete esses rótulos. Essa alteração foi feita para tornar mais fácil para comparar com os resultados reais.
A saída do diagrama de dispersão é aqui mostrado:
Comparar os K-means saída para a trama de dispersão original - que fornece rótulos porque os resultados são conhecidos. Você pode ver que as duas parcelas semelhantes entre si. O algoritmo K-means fez um bom trabalho com o clustering. Embora as previsões não são perfeitos, eles vêm perto. Isso é uma vitória para o algoritmo.
Na aprendizagem não supervisionada, você raramente obter uma saída que é 100 por cento preciso, porque os dados do mundo real raramente é tão simples. Você não vai saber quantos grupos de escolher (ou de qualquer parâmetro de inicialização para outros algoritmos de agrupamento). Você terá que lidar com os outliers (pontos de dados que não parecem consistentes com outros) e conjuntos de dados complexos que são densos e não linearmente separáveis.
Você só pode chegar a este ponto se você sabe quantos agrupamentos o conjunto de dados tem. Você não precisa se preocupar com quais recursos para usar ou reduzir a dimensionalidade de um conjunto de dados que tem tão poucos recursos (neste caso, quatro). Este exemplo apenas reduziu as dimensões por razões de visualizar os dados num gráfico. Ele não se encaixava no modelo com o conjunto de dados reduziu-dimensionalidade.
Aqui está a lista completa do código que cria ambos os gráficos de dispersão e cor-códigos dos pontos de dados:
gt; gt; gt; de sklearn.decomposition PCAgt importação; gt; gt; sklearn.cluster de importação KMeansgt; gt; gt; de sklearn.datasets importar load_irisgt; gt; gt; importação Pylab como plgt; gt; gt; íris = load_iris () gt; gt; gt; pca = PCA (n_components = 2) .fit (iris.data) gt; gt; gt; pca_2d = pca.transform (iris.data) gt; gt; gt; pl.figure gt ( `Referência Plot`); gt; gt; pl.scatter (pca_2d [:, 0], pca_2d [:, 1], c = iris.target) gt; gt; gt; kmeans = kmeans (n_clusters = 3, random_state = 111) gt; gt; gt; kmeans.fit (iris.data) gt; gt; gt; pl.figure ( `K-means com 3 clusters`) gt; gt; gt; pl.scatter (pca_2d [:, 0], pca_2d [:, 1], c = kmeans.labels_) gt; gt; gt; pl.show ()