[PYTHON] Analyse en composantes principales Analyser les nombres manuscrits à l'aide de l'ACP. Partie 1

Au début##

L'analyse des nombres manuscrits a été transformée en série, mais cette fois je voudrais analyser à l'aide de l'analyse en composantes principales (PCA) et de l'analyse discriminante linéaire (LDA), que l'on peut appeler une version supervisée. Je pense. J'utilise la bibliothèque d'apprentissage automatique de python scikit-learn.

[Ancien article sur l'analyse de données numériques manuscrites]

Jouer des nombres manuscrits avec python, partie 1 [Jouez des nombres manuscrits avec python, partie 2 (identifier)] (http://qiita.com/kenmatsu4/items/2d21466078917c200033) [Apprentissage automatique] Écrivez vous-même la méthode du k-plus proche voisin en python et reconnaissez les nombres manuscrits

Analyse en composantes principales (ACP)

Tout d'abord, l'analyse des composants principaux. Fondamentalement, il s'agit d'une analyse qui collecte plusieurs éléments de données et extrait ce que l'on appelle le composant principal. En machine learning, je pense qu'il est principalement utilisé dans le but de réduire la dimension des données cibles. Puisque les nombres manuscrits manipulés ici sont des données d'image de 28x28 = 784 pixels, ce sera un vecteur de 784 dimensions, mais nous essaierons de réduire cette dimension.

Image de l'analyse des composants principaux

Comme le montre la figure ci-dessous, un exemple de dépôt d'informations bidimensionnelles dans une dimension sera expliqué. À titre d'exemple souvent utilisé, je pense qu'il existe un moyen d'extraire deux composantes principales telles que la capacité scientifique et la capacité littéraire des notes de chaque matière telles que la langue japonaise, l'arithmétique, la science et la société, mais cela explique l'image. Je veux. Puisque je veux le montrer dans la figure, j'utiliserai des données de test avec deux sujets, l'axe horizontal correspond aux mathématiques et l'axe vertical aux notes scientifiques. Dans ce cas, les mathématiques et la science sont des capacités de la science, il semble donc y avoir une corrélation. La ligne droite bleue est le composant principal: elle représente la capacité scientifique. Comme le montrent les flèches, l'endroit où la ligne perpendiculaire à cette ligne droite est supprimée de chaque donnée peut être exprimé sous forme de données unidimensionnelles en tant que capacité de la science.

PCA-annex-11-compressor.png

C'est un graphique après l'avoir rendu unidimensionnel. PCA-annex-8-compressor.png

La longueur de la ligne perpendiculaire tracée à partir des points de données montrés dans la figure ci-dessous jusqu'à la ligne droite du composant principal est appelée la quantité de perte d'information. C'est la partie qui est perdue lorsque vous réduisez la dimension. La ligne droite du composant principal passe par le point moyen des données, et la pente qui minimise cette quantité de perte d'informations est dérivée et déterminée. C'est aussi la méthode du carré minimum. Le calcul est effectué pour minimiser la somme des carrés de la quantité de perte d'information.

PCA-annex-9-compressor.png

Combien de dimensions souhaitez-vous supprimer?

Comme je l'ai mentionné plus tôt à propos de l'ampleur de la perte d'information, il y a aussi la notion de taux de cotisation, qui y est inextricablement liée. En gros, c'est le rapport entre ce que le composant principal peut expliquer. Dans l'exemple de la synthèse des mathématiques et des sciences en tant que capacité scientifique 1 = Taux de contribution de la première composante principale (capacité scientifique) + Taux de perte d'information (autres) = 0,89997 + 0,10003 Ainsi, environ 90% pourraient être expliqués en une seule dimension.

Maintenant, effectuons une analyse des composants principaux sur des données numériques écrites en python pour le moment. Tout d'abord, analysons ce qui arrive à la variation des données pour chaque nombre en la divisant en chaque nombre au lieu de le faire pour toutes les données. Voici la partie principale du code. (Le code complet est ici)


#Lire les données
raw_data= np.loadtxt('train_master.csv',delimiter=',',skiprows=1)
#dataset = DigitDataSet(raw_data)
dataset = DigitDataSet(raw_data)
data = [None for i in range(10)]
for i in range(10):
    data[i] = dataset.getByLabel(i,'all')

#Effectuer une analyse des composants principaux
#Calculez la différence de taux de cotisation en fonction du nombre de dimensions après réduction
comp_items = [5,10,20,30]  #Liste des dimensions post-réduction
cumsum_explained = np.zeros((10,len(comp_items)))
for i, n_comp in zip(range(len(comp_items)), comp_items):
    for num in range(10):                        #Analysez chaque nombre
        pca = decomp.PCA(n_components = n_comp)  #Création d'un objet d'analyse de composant principal
        pca.fit(data[num])                       #Effectuer une analyse des composants principaux
        transformed = pca.transform(data[num])   #Générer un vecteur réduit pour les données
        E = pca.explained_variance_ratio_        #Taux de cotisation
        cumsum_explained[num, i] = np.cumsum(E)[::-1][0] #Taux de cotisation cumulé

print "| label |explained n_comp:5|explained n_comp:10|explained n_comp:20|explained n_comp:30|"
print "|:-----:|:-----:|:-----:|:-----:|:-----:|"
for i in range(10):
    print "|%d|%.1f%|%.1f%|%.1f%|%.1f%|"%(i, cumsum_explained[i,0]*100, cumsum_explained[i,1]*100, cumsum_explained[i,2]*100, cumsum_explained[i,3]*100)

Le tableau ci-dessous montre chaque taux de cotisation cumulé lorsque le nombre de dimensions après réduction est de 5, 10, 20 et 30. Par exemple, si le nombre de dimensions est de 30, il est réduit du nombre d'origine de dimensions de 784 à 30, et il montre quel pourcentage est expliqué par le vecteur à 30 dimensions. Il existe des variations pour chaque nombre, mais si vous prenez jusqu'à environ 30 dimensions, vous serez en mesure d'expliquer environ 70%. Le nombre de dimensions a été réduit de 784 à 30, soit environ 4%, mais il est assez facile de penser que 7,80% peuvent être expliqués.

label explained n_comp:5 explained n_comp:10 explained n_comp:20 explained n_comp:30
0 48.7% 62.8% 75.9% 82.0%
1 66.6% 76.6% 84.8% 88.7%
2 36.5% 51.9% 67.2% 75.3%
3 39.7% 53.7% 68.3% 75.8%
4 39.4% 56.3% 70.7% 77.9%
5 42.3% 55.5% 69.7% 77.0%
6 44.5% 59.7% 74.0% 80.9%
7 45.9% 61.0% 74.2% 80.6%
8 36.3% 49.6% 65.5% 74.1%
9 43.2% 58.5% 73.4% 80.4%

Le graphique ci-dessous est une image des 10 principaux composants après la réduction. Ils sont classés par ordre décroissant du taux de cotisation à partir du coin supérieur gauche. (La partie de exp: est le taux de cotisation)

PCAForEachDigits_0-compressor.png PCAForEachDigits_1-compressor.png PCAForEachDigits_2-compressor.png PCAForEachDigits_3-compressor.png PCAForEachDigits_4-compressor.png PCAForEachDigits_5-compressor.png PCAForEachDigits_6-compressor.png PCAForEachDigits_7-compressor.png PCAForEachDigits_8-compressor.png PCAForEachDigits_9-compressor.png

Appliquer l'analyse des composants principaux à l'ensemble des données

Auparavant, nous avons appliqué l'analyse en composantes principales pour chaque nombre, mais ensuite nous avons appliqué l'analyse en composantes principales à toutes les 43 000 données numériques, et finalement réduit la dimension à deux dimensions. Il semble qu'il passe trop de 784 dimensions à 2 dimensions, mais lorsqu'il est changé en 2 dimensions, un graphique est dessiné. Le graphique ci-dessous est un tracé bidimensionnel de toutes les données. C'est devenu une figure assez encombrée. En effet, l'analyse des composantes principales calcule les composantes principales collectivement sans considérer le nombre de chaque point de données. LDA est une analyse qui considère quel nombre est pour chaque point, mais je voudrais expliquer cela la prochaine fois. En tout cas, je pense que c'est un gros avantage de pouvoir le voir dans un graphique en le déposant en deux dimensions.

PCA_ALL2-compressor.png ** Graphique traçant tous les points **

PCA_ALL_reps-compressor.png ** Un graphique dans lequel les points moyennés sont tracés et exprimés dans une taille proportionnelle à la variance **

Voici la partie principale du code python.


# PCA ALL
pca = decomp.PCA(n_components = 2)
pca.fit(dataset.getData())
transformed = pca.transform(dataset.getData())
colors = [plt.cm.hsv(0.1*i, 1) for i in range(10)]
plt.figure(figsize=(16,11))
for i in range(10):
    plt.scatter(0,0, alpha=1, c=colors[i],label=str(i))
plt.legend()

for l, d in zip(dataset.getLabel(), transformed):
    plt.scatter(d[0],d[1] , c=colors[int(l)], alpha=0.3)

plt.title("PCA(Principal Component Analysis)")
plt.show()

#Dessinez la valeur représentative de chaque nombre dans un graphique
transformed = [pca.transform(dataset.getByLabel(label=i,num=('all'))) for i in range(10)]

ave = [np.average(transformed[i],axis=0) for i in range(10)]
var = [np.var(transformed[i],axis=0) for i in range(10)]
plt.clf()
plt.figure(figsize=(14,10))
for j in range(10):
    plt.scatter(100,100, alpha=1, c=colors[j],label=str(j))
plt.legend()
plt.xlim(-1500, 1500)
plt.ylim(-1500, 1500)

for i, a, v in zip(range(10), ave, var):
    print i, a[0], a[1]
    plt.scatter(a[0], a[1], c=colors[i], alpha=0.6, s=v/4, linewidth=1)
    plt.scatter(a[0], a[1], c="k", s=10)    
    plt.text(a[0], a[1], "digit: %d"%i, fontsize=12)

plt.title("PCA Representative Vector for each digit.")
plt.savefig("PCA_RepVec.png ")
plt.show()

Suite.

Recommended Posts

Analyse en composantes principales Analyser les nombres manuscrits à l'aide de l'ACP. Partie 2
Analyse en composantes principales Analyser les nombres manuscrits à l'aide de l'ACP. Partie 1
Analyse en composantes principales (Analyse en composantes principales: ACP)
Reconnaissance faciale à l'aide de l'analyse des composants principaux
Ceci et cela de l'analyse en composantes principales
Analyse des composants principaux à l'aide de python de nim avec nimpy
Analyse en composants principaux (PCA) et analyse en composants indépendants (ICA) avec python
Apprendre sans enseignant 3 Analyse des principales composantes
Jouez des nombres manuscrits avec Python Partie 1
Analyse des composants principaux avec Spark ML
[GWAS] Tracez les résultats de l'analyse en composantes principales (ACP) par PLINK
Traitement de l'analyse japonaise à l'aide de Janome part1
Python: apprentissage non supervisé: analyse principale
Jouez des nombres manuscrits avec python, partie 2 (identifier)
Analyse des composants principaux avec Livedoor News Corpus --Préparation--
J'ai essayé d'analyser les principaux composants avec les données du Titanic!
PRML Chapitre 12 Mise en œuvre de l'analyse principale bayésienne Python