[PYTHON] Compréhension mathématique de l'analyse en composantes principales depuis le début

Introduction

Cette fois, j'ai réétudié l'analyse en composantes principales, je vais donc la résumer. J'avais étudié l'analyse en composantes principales elle-même auparavant, mais je n'avais que la connaissance du calcul du vecteur de valeur propre à partir de la matrice distribuée co-distribuée et de la compression des dimensions, ou de sa mise en œuvre à l'aide de scikit-learn. Cependant, je ne savais pas pourquoi l'axe pouvait être obtenu à partir des valeurs propres de la matrice de variance-co-distribution, j'ai donc décidé de résumer la théorie computationnelle à partir d'un point rudimentaire. ~~ (parce que je peux facilement oublier) ~~ Et enfin, je l'ai implémenté avec python basé sur la théorie. S'il vous plaît, restez avec moi jusqu'à la fin si vous le souhaitez.

Qu'est-ce que l'analyse en composantes principales? (Vue d'ensemble)

Tout d'abord, je vais expliquer brièvement l'analyse des principaux composants et le flux. L'analyse en composantes principales est une technique utilisée pour compresser les dimensions des données pour une visualisation plus facile lorsque les dimensions sont grandes. Comme le montre la figure ci-dessous, si vous prenez un axe dans une certaine direction et déposez des points perpendiculairement à cet axe, vous pouvez représenter efficacement des données bidimensionnelles dans une dimension. Bien entendu, les informations détenues par la distance entre l'axe et le point réel (la ligne partant de chaque point) seront perdues. Par conséquent, déterminez l'axe pour que la distribution soit maximisée afin que les informations ne soient pas le plus perdues. (Détails plus tard)

スクリーンショット 2020-11-02 18.41.19.png Cette fois, les données bidimensionnelles sont rendues unidimensionnelles, mais en compressant les données de grande dimension de cette manière, il devient plus facile pour nous d'interpréter et la précision de la classification peut être améliorée.

Exemple concret

Prenons un exemple concret. Les notes de 5 matières de 5 personnes

Nom langue nationale société Anglais arithmétique Science
A 60 70 70 40 30
B 70 60 80 30 30
C 40 20 30 70 80
D 30 20 40 80 80
E 30 30 30 80 70

Supposons que c'était le cas. ~~ De toute évidence biaisé ... ~~ La représentation graphique est une façon de réfléchir aux tendances de ces personnes. Cependant, lors du traçage par rapport à des données à 5 dimensions, il est assez difficile à illustrer et à comprendre. À propos, cela est exprimé en espace 3D + couleur (condition rouge et condition bleue) comme suit. スクリーンショット 2020-11-02 18.49.12.png

Après tout, je pense qu'il est difficile de comprendre ce que vous dites dans ce graphique. (Cette fois, il y a 5 sujets, donc il n'y a rien que vous ne compreniez pas, mais s'il s'agit d'un ensemble de données que vous ne comprenez pas bien, c'est difficile à deviner.) Cette fois, lorsque j'ai compressé cela par l'analyse en composantes principales et fait une figure en deux dimensions, c'est devenu comme suit. スクリーンショット 2020-11-02 17.41.35.png

(PC est le composant principal: composant principal) Nous devons interpréter ce que chaque axe représente dans les résultats de l'analyse en composantes principales. Dans le cas de cet exemple, il semble que PC1 ait une valeur élevée pour ceux qui ont des matières scientifiques élevées et une valeur faible pour ceux qui ne sont pas bons dans les matières scientifiques. Par conséquent, j'interprète que PC1 peut indiquer le degré de force de la science. C'est PC2, mais honnêtement je ne peux pas interpréter ce que cela signifie (je vais étudier comment l'interpréter un peu plus). Mais regardons le taux de cotisation ici. Le taux de cotisation est la valeur de la façon dont chaque axe peut expliquer les données originales. J'expliquerai en détail plus tôt, mais cette fois le taux de cotisation est

PC Taux de cotisation
PC1 9.518791e-01
PC2 3.441020e-02
PC3 1.275504e-02
PC4 9.556157e-04
PC5 8.271560e-35

On voit que les composants de PC1 peuvent expliquer 95% et PC2 peut expliquer 3,4%. Par conséquent, PC1 seul peut expliquer la plupart de ces données. Cette fois, les scores sont biaisés dans les matières des arts libéraux et des sciences pour faciliter l'imagination, mais de cette manière, l'analyse en composantes principales est l'une des méthodes d'analyse qui permet d'imaginer plus facilement des données à plusieurs dimensions. Cette fois, je voudrais expliquer cette analyse en composantes principales afin que même des gens comme moi puissent la comprendre.

Qu'est-ce que l'analyse en composantes principales? (Théorie)

スクリーンショット 2020-11-02 18.41.19.png

Examinons de plus près la théorie de l'analyse en composantes principales. La figure ci-dessus convertit les données bidimensionnelles en nouvelles données unidimensionnelles comme décrit ci-dessus. Plus la distance entre l'axe et le point de données est grande, plus la perte de données est considérée, il est donc nécessaire de trouver la direction avec la plus grande dispersion. (La direction avec la plus grande dispersion est la première composante principale) Comment trouver cette direction est de trouver le vecteur propre correspondant à la plus grande valeur propre de la matrice distribuée co-distribuée, mais j'aimerais voir pourquoi on peut l'envisager.

Tout d'abord, considérez un seul point. スクリーンショット 2020-11-03 15.55.49.png

Définissez un point de données et un vecteur d'axe comme suit.

\vec{x}= \left[ \begin{array}{r} x_1 \\\ x_2 \end{array} \right] \\\
\vec{v}= \left[ \begin{array}{r} v_1 \\\ v_2 \end{array} \right] \\\
pourtant\|\vec{v}\|=1 \\\

Ensuite, la longueur lorsque le vecteur $ \ vec {x} est déposé perpendiculairement à l'axe $ vecteur $ \ vec {v} $ est

\vec{v}^\mathrm{T}\vec{x}=\left[ \begin{array}{r} v_1 & v_2 \end{array} \right]\left[ \begin{array}{r} x_1 \\\ x_2 \end{array} \right]=v_1 x_1+v_2 x_2

Il est indiqué par.

En aparté ici, je certifierai que la longueur est indiquée par $ \ vec {v} ^ \ mathrm {T} \ vec {x} $. J'espère que vous ne pouvez voir que ceux qui sont intéressés. Tout d'abord, définissez le vecteur $ \ vec {b} $, qui est la rotation du vecteur $ \ vec {a} $ et du vecteur $ \ vec {a} $ par $ \ theta $, comme suit. ![Capture d'écran 2020-11-03 23.43.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707273/2b70d0bc-cf7a-700c-615a -81cc7c8e9aef.png)

\vec{a}= \left[ \begin{array}{r} a_1 \\\ a_2 \end{array} \right] \vec{b}= \left[ \begin{array}{r} b_1 \\\ b_2 \end{array} \right]=\left[ \begin{array}{r} cos\theta&-sin\theta \\\ sin\theta & cos\theta \end{array} \right]\left[ \begin{array}{r} a_1 \\\ a_2 \end{array} \right]

En gros, il est multiplié par le vecteur $ \ vec {a} $

\left[ \begin{array}{r} cos\theta&-sin\theta \\\ sin\theta & cos\theta \end{array} \right]

Est une matrice qui fait pivoter le vecteur $ \ vec {a} $ de $ \ theta $. La raison pour laquelle la transformation qui tourne dans cette matrice peut être prouvée par le théorème d'addition.

Preuve par le théorème d'addition ![Capture d'écran 2020-11-04 17.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707273/08fa4b94-33c7-ed1a- 2648-2d93a92e7141.png) Si la longueur du vecteur est r, le vecteur $ \ vec {a} $ et le vecteur $ \ vec {b} $ sont exprimés comme suit.

\vec{a}= \left[ \begin{array}{r} rcos\alpha \\\ rsin\alpha \end{array} \right] \vec{b}= \left[ \begin{array}{r} rcos(\alpha + \theta) \\\ rsin(\alpha + \theta) \end{array} \right]=\left[ \begin{array}{r} rcos(\alpha)cos(\theta) - rsin(\alpha)sin(\theta) \\\ rsin(\alpha)cos(\theta)+rcos(\alpha)sin(\theta) \end{array} \right]=\left[ \begin{array}{r} cos\theta&-sin\theta \\\ sin\theta & cos\theta \end{array} \right]\left[ \begin{array}{r} rcos(\alpha) \\\ rsin(\alpha) \end{array} \right]=\left[ \begin{array}{r} cos\theta&-sin\theta \\\ sin\theta & cos\theta \end{array} \right]\vec{a}

C'est donc prouvé.

La preuve est que le vecteur $ \ vec {b} $ doit avoir la même longueur lorsqu'il est déposé verticalement le long du vecteur $ \ vec {a} $.

\|\vec{b}\|cos\theta=\vec{v}^\mathrm{T}\vec{b}

Est affiché. Parce que le vecteur $ \ vec {v} $ est dans le même sens que le vecteur $ \ vec {a} $ et a une taille de 1.

\vec{v}=\frac{1}{\sqrt{a_1^2+a_2^2}}\vec{a}

. Par conséquent

\vec{v}^\mathrm{T}\vec{b}=\frac{1}{\sqrt{a_1^2+a_2^2}}\left[ \begin{array}{r} a_1 & a_2 \end{array} \right]\left[ \begin{array}{r} b_1 \\\ b_2 \end{array} \right] \quad\ =\frac{1}{\sqrt{a_1^2+a_2^2}}\left[ \begin{array}{r} a_1 & a_2 \end{array} \right]\\left[ \begin{array}{r} cos\theta&-sin\theta \\\ sin\theta & cos\theta \end{array} \right]\left[ \begin{array}{r} a_1 \\\ a_2 \end{array} \right] \quad\ =\frac{1}{\sqrt{a_1^2+a_2^2}}\left[ \begin{array}{r} a_1 & a_2 \end{array} \right]\left[ \begin{array}{r} a_1cos\theta-a_2sin\theta \\\ a_1sin\theta+a_2cos\theta \end{array} \right] \quad\ =\frac{1}{\sqrt{a_1^2+a_2^2}}(a_1^2cos\theta-a_1a_2sin\theta+a_1a_2sin\theta+a_2^2cos\theta) \quad\ =\frac{1}{\sqrt{a_1^2+a_2^2}}(a_1^2+a_2^2)cos\theta \quad\ =\sqrt{a_1^2+a_2^2}cos\theta \quad\ =\|\vec{b}\|cos\theta

Par conséquent, trouvez la longueur lorsque le vecteur $ \ vec {x} $ est déposé verticalement sur le vecteur $ \ vec {v} par $ \ vec {v} ^ \ mathrm {T} \ vec {x} $. Peut être fait. $

En d'autres termes, le $ \ vec {v} $ souhaité est un vecteur qui augmente la dispersion de cette longueur $ \ vec {v} ^ \ mathrm {T} \ vec {x} $ lorsqu'il y a n points de données. La distribution de $ \ vec {v} ^ \ mathrm {T} \ vec {x} $

\frac{1}{n-1}\sum_{i=1}^{n}\left[\vec{v}^\mathrm{T}(\vec{x_i}-\hat{\mu})\right]^2\ \;=\; \vec{v}^{\mathrm{T}}\frac{1}{n-1}\sum_{i=1}^n(\vec{x_i}-\hat{\mu})(\vec{x_i}-\hat{\mu})^\mathrm{T}\vec{v}

$ (\ vec {a} \ vec {b}) ^ \ mathrm {T} = \ vec {a} ^ {\ mathrm {T}} \ vec {b} ^ {\ mathrm {T}} $ ..

Puisqu'il est entouré du vecteur $ \ vec {v} $ et que l'autre partie se présente sous la forme d'une matrice distribuée co-distribuée.

\Sigma=\frac{1}{n-1}\sum_{i=1}^n(\vec{x_i}-\hat{\mu})(\vec{x_i}-\hat{\mu})^\mathrm{T}\\

Et met La distribution est

\vec{v}^\mathrm{T}\Sigma\vec{v}

Peut être placé. En d'autres termes, pour trouver le vecteur $ \ vec {v} $ dans la direction qui maximise cette variance

\max_{v:|v|=1}(\vec{v}^\mathrm{T}\Sigma\vec{v})

Penser à. Ici, $ \ Sigma $ est une matrice semi-régulière à valeurs fixes, donc elle peut être diagonalisée avec une matrice orthogonale.

Pour tous les vecteurs non nuls $ x ∈ ℝ ^ n $, lorsque $ x ^ TAx ≥ 0 $ vaut, on l'appelle un semi-défini positif. --Horn and Johnson(2013) Definition 4.1.11--

En d'autres termes

\Sigma\vec{v_i}=\lambda_i\vec{v_i}

Considérons le vecteur propre et la valeur propre

V=[v_1,v_2,...,v_d] \\\
\Lambda=diag(\lambda_1,\lambda_2,...,\lambda_d)

Quand je le mets $ \ Sigma V $ est dû au fait que chaque vecteur V est converti en multiple de valeur propre correspondant.

\Sigma V=V\Lambda

Est Parce que $ V $ est une matrice orthogonale

\Sigma = V\Lambda V^\mathrm{T} \quad V^\mathrm{T}\Sigma V=\Lambda

Sur cette base, nous trouverons le vecteur qui maximise la variance. Dans ceux auxquels j'ai fait référence, la solution maximisée s'est avérée être la plus grande valeur propre comme suit. (Référence [1]) スクリーンショット 2020-11-11 16.02.25.png

Cependant, je ne pouvais pas bien comprendre cela, alors j'y ai réfléchi. (Veuillez préciser si c'est faux) Considérons un cas bidimensionnel pour simplifier le calcul, Première

\begin{align}
V&=\left[\begin{array}{cc} v_1 & v_2\end{array} \right]=\left[\begin{array}{cc} v_{1x} & v_{2x} \\\ v_{1y} & v_{2y}\end{array} \right] \\\
\vec{v}&=\left[\begin{array}{c} v_x \\\ v_y \end{array}\right] \\\
\Lambda&=\left[\begin{array}{cc} \lambda_1 &0 \\\ 0 & \lambda_2 \end{array}\right] 
\end{align}

Et mettez-le. Et le contenu de la parenthèse sera transformé.

\begin{align}
\vec{v}^\mathrm{T}\Sigma\vec{v} &= \vec{v}^\mathrm{T}V\Lambda V^\mathrm{T}\vec{v} \\\\

&= \vec{v}^\mathrm{T}\left[\begin{array}{cc} v_{1x} & v_{2x} \\\ v_{1y} & v_{2y}\end{array} \right]\left[\begin{array}{cc} \lambda_1 &0 \\\ 0 & \lambda_2 \end{array}\right]  \left[\begin{array}{cc} v_{1x} & v_{1y} \\\ v_{2x} & v_{2y}\end{array} \right]\vec{v} \\\\

&=\vec{v}^\mathrm{T}\left[ \begin{array}{cc} v_{1x}^2\lambda_1+v_{2x}^2 \lambda_2 & v_{1x} v_{1y} \lambda_1 +v_{2x} v_{2y} \lambda_2 \\\ v_{1x} v_{1y} \lambda_1 +v_{2x} v_{2y} \lambda_2 & v_{1y}^2\lambda_1+V_{2y}^2 \lambda_2 \end{array} \right]  \vec{v} \\\\

&=\vec{v}^\mathrm{T}\left( \left[ \begin{array}{cc} v_{1x}^2 & v_{1x} v_{1y} \\\ v_{1x} v_{1y} & v_{1y}^2 \end{array} \right]\lambda_1+\left[ \begin{array}{cc} v_{2x}^2& v_{2x} v_{2y} \\\ v_{2x} v_{2y} &V_{2y}^2  \end{array} \right]\lambda_2\right)  \vec{v} \\\\

&=\vec{v}^\mathrm{T} \left[ \begin{array}{cc} v_{1x}^2 & v_{1x} v_{1y} \\\ v_{1x} v_{1y} & v_{1y}^2 \end{array} \right]\vec{v}\lambda_1+\vec{v}^\mathrm{T}\left[ \begin{array}{cc} v_{2x}^2& v_{2x} v_{2y} \\\ v_{2x} v_{2y} &V_{2y}^2  \end{array} \right]\vec{v}\lambda_2  \\\
\end{align}

Si vous ne retirez que la section de $ \ lambda_1 $ et que vous y pensez

\begin{align}
\vec{v}^\mathrm{T} \left[ \begin{array}{cc} v_{1x}^2 & v_{1x} v_{1y} \\\ v_{1x} v_{1y} & v_{1y}^2 \end{array} \right]\vec{v}\lambda_1&=\left[\begin{array}{c} v_x & v_y \end{array}\right] \left[ \begin{array}{cc} v_{1x}^2 & v_{1x} v_{1y} \\\ v_{1x} v_{1y} & v_{1y}^2 \end{array} \right]\left[\begin{array}{c} v_x \\\ v_y \end{array}\right]\lambda_1 \\\\

&=(v_{1x}^2 v_x^2+2v_{1x}v_{1y}v_xv_y+v_{1y}^2 v_y^2)\lambda_1 \\\\

&=(v_{1x}v_x+v_{1y}v_y)^2\lambda_1 \\\\

&=\left(\left[\begin{array}{c}v_{1x} & v_{1y} \end{array}\right]\left[\begin{array}{c} v_x \\\ v_y \end{array}\right]\right)^2\lambda_1 \\\\

&=\left(\vec{v_1}^\mathrm{T} \vec{v}\right)^2\lambda_1
\end{align}

Sera. En d'autres termes

\begin{align}
\max_{v:|v|=1}\left(\vec{v}^\mathrm{T}\Sigma\vec{v}\right) &=\max_{v:|v|=1}\left(\left(\vec{v_1}^\mathrm{T}\vec{v}\right)^2\lambda_1+\left(\vec{v_2}^\mathrm{T}\vec{v}\right)^2\lambda_2\right) \\\

&=\max_{v:|v|=1}\left(\sum_{i=1}^2\left(\vec{v_i}^\mathrm{T}\vec{v}\right)^2\lambda_i\right) \\\

Généraliser\\\

&=\max_{v:|v|=1}\left(\sum_{i=1}^d\left(\vec{v_i}^\mathrm{T}\vec{v}\right)^2\lambda_i\right)
\end{align}

Sera. A ce moment, $ \ vec {v}, \ vec {v_i} $ est un vecteur unitaire, et $ \ vec {v_1}, \ vec {v_2}, ..., \ vec {v_d} $ sont orthogonaux l'un à l'autre. Par conséquent, lorsque $ \ vec {v} = \ vec {v_i} $

\max_{v:|v|=1}\left(\vec{v_i}^\mathrm{T}\vec{v}\right)=1

Sera. (Le produit interne des vecteurs unitaires dans la même direction prend 1) De même, quand $ i \ neq j $

\max_{v:|v|=1}\left(\vec{v_j}^\mathrm{T}\vec{v}\right)=0

Est. (Le produit interne des vecteurs orthogonaux est 0)

En d'autres termes, la valeur maximale est prise lorsque le vecteur v est égal à la valeur propre maximale et au vecteur propre correspondant.

\max_{v:|v|=1}\left(\sum_{i=1}^d\left(\vec{v_i}^\mathrm{T}\vec{v}\right)^2\lambda_i\right)=\lambda_1

Sera.

De même, si vous voulez prendre l'axe avec la deuxième plus grande variance, vous pouvez aligner $ \ vec {v} $ dans la même direction que le vecteur propre correspondant à la deuxième plus grande valeur propre.

Matrice co-distribuée distribuée et matrice de corrélation

Vous avez peut-être entendu dire qu'il y a deux façons de prendre le vecteur propre de la matrice de variance-covariance et le vecteur propre de la matrice de corrélation lors de l'analyse en composantes principales. En premier lieu, la matrice de corrélation est la matrice de co-distribution de dispersion des données divisée par l'écart type des données. Il s'agit également d'une matrice distribuée co-distribuée de données standardisées, car il est normal de soustraire d'abord la moyenne. En d'autres termes, si les données sont d'abord standardisées, la théorie sera la même qu'auparavant, vous pouvez donc voir que l'analyse en composantes principales peut être effectuée même avec le vecteur propre de l'écart type. Par conséquent, il est possible d'effectuer une analyse en composantes principales par l'une ou l'autre méthode, mais on dit qu'il vaut mieux prendre le vecteur propre de la matrice de corrélation. En effet, si les données sont une matrice distribuée co-distribuée telle quelle, les unités des données sont différentes et il faut en tenir compte. Par conséquent, on dit qu'il est préférable d'effectuer une analyse en composantes principales sans unités. (Je ne pourrais pas expliquer en détail comment cela m'affecterait, alors j'aimerais l'ajouter si je rencontre quelque chose.)

Taux de cotisation

Enfin, sur le taux de cotisation. Le taux de cotisation fait référence à ce que représentent les données. Et la valeur peut être montrée par l'ampleur de la dispersion comme je l'ai mentionné dans la théorie, et l'amplitude de la dispersion est devenue la valeur propre lors de la prise d'un certain vecteur de direction. Puisque le rapport de la valeur propre peut être obtenu, le taux de contribution PV est $PV_i=\frac{\lambda_i}{\sum_{j=1}^{d}\lambda_j}$

Est requis par.

La mise en oeuvre#

Ensuite, je voudrais l'implémenter en utilisant cette théorie. Les données utilisées ici sont les données de notes des cinq personnes utilisées dans le premier aperçu.

Nom langue nationale société Anglais arithmétique Science
A 60 70 70 40 30
B 70 60 80 30 30
C 40 20 30 70 80
D 30 20 40 80 80
E 30 30 30 80 70

Tout d'abord, examinons l'implémentation PCA de scicit-learn comme la bonne réponse. Quand je l'ai implémenté, ça ressemble à ça. ~~ J'utilise les pandas uniquement pour étudier parce que je n'y suis pas habitué ~~

scikit_pca.py


import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA
import pandas as pd
                        

#Créer des données
name = ['a','b','c','d','e']                                                   
a = np.array([60,70,70,40,30])                                                 
b = np.array([70,60,80,30,30])
c = np.array([40,20,30,70,80])
d = np.array([30,20,40,80,80])
e = np.array([30,30,30,80,70])  
                        
#Stocker dans le cadre
df = pd.DataFrame([a,b,c,d,e],columns=['language','society','english','math','science'],index=name)
                                                                               
dfs = df.iloc[:,:].apply(lambda x:(x-x.mean())/x.std(),axis=0) #Standardisation des données

#scikit-Instanciation PCA et apprentissage avec apprentissage
pca = PCA()
pca.fit(dfs)
feature=pca.transform(dfs)

                                                           
#Sortie de résultat
print(pd.DataFrame(feature,columns=["PC{}".format(x+1) for x in range(len(dfs.columns))]).head())

plt.figure()                                                                   
                                                                               
for i in range(len(name)):                                                     
        plt.annotate(name[i],xy=(feature[i,0],feature[i,1]))
plt.scatter(feature[:,0],feature[:,1],marker='o')                              
plt.xlabel('PC1')                                                              
plt.ylabel('PC2')
plt.show()                                                                     

print(pd.DataFrame(pca.explained_variance_ratio_,index=["PC{}".format(x+1) for x in range(len(dfs.columns))]))   

Le résultat est le suivant.

$python scikit_pca.py
        PC1       PC2       PC3       PC4           PC5
0 -2.161412  0.414977 -0.075496 -0.073419  4.163336e-17
1 -2.601987 -0.364980  0.088599  0.064849  4.163336e-17
2  1.479995 -0.437661 -0.290635 -0.037986  4.163336e-17
3  1.727683 -0.047103  0.382252 -0.035840 -1.387779e-17
4  1.555721  0.434767 -0.104720  0.082396 -1.457168e-16

                0
PC1  9.518791e-01
PC2  3.441020e-02
PC3  1.275504e-02
PC4  9.556157e-04
PC5  8.271560e-35

スクリーンショット 2020-11-02 17.41.35.png

Ensuite, je l'ai implémenté sur la base de la théorie. MyPCA est défini comme une classe, et il est entraîné par la méthode fit () et projeté dans un nouvel espace par la méthode transform () afin qu'il puisse être utilisé de la même manière que scicit-learn. Sauf pour la définition de classe du programme précédent

pca=PCA()

À

pca=MyPCA()

Puisqu'il est seulement changé en, je l'ai omis et je n'ai listé que la définition de classe, mais c'est devenu comme suit.

my_pca.py


#myPCA program

class MyPCA:

        e_values = None #Enregistrer des valeurs uniques
        e_covs = None   #Sauvegarde du vecteur propre
        explained_variance_ratio_ = None
        def fit(self,dfs):
                #Traitement pour permettre d'utiliser à la fois les données pandas et les données numpy
                if(type(dfs)==type(pd.DataFrame())):
                        all_data = dfs.values
                else:
                        all_data=dfs

                data_cov=np.cov(all_data,rowvar=0,bias=0) #Traitement matriciel co-distribué distribué
                self.e_values,self.e_vecs=np.linalg.eig(data_cov) #Calcul des valeurs propres et des vecteurs propres

                self.explained_variance_ratio_= self.e_values/self.e_values.sum() #Calcul du taux de cotisation

        def transform(self,dfs):
                #Traitement pour permettre d'utiliser à la fois les données pandas et les données numpy
                if(type(dfs)==type(pd.DataFrame())):
                        all_data = dfs.values
                else:
                        all_data=dfs

                feature = []
                for e_vec in self.e_vecs.T:
                        temp_feature=[]
                        for data in all_data:
                                temp_feature.append(np.dot(e_vec,data)) #Calcul du produit intérieur
                        feature.append(temp_feature)
                return np.array(feature).T


Et le résultat.

        PC1       PC2       PC3           PC4       PC5
0  2.161412 -0.414977 -0.075496 -7.771561e-16  0.073419
1  2.601987  0.364980  0.088599  1.665335e-15 -0.064849
2 -1.479995  0.437661 -0.290635 -4.996004e-16  0.037986
3 -1.727683  0.047103  0.382252 -5.551115e-16  0.035840
4 -1.555721 -0.434767 -0.104720  0.000000e+00 -0.082396
Attribute Qt::AA_EnableHighDpiScaling must be set before QCoreApplication is created.
                0
PC1  9.518791e-01
PC2  3.441020e-02
PC3  1.275504e-02
PC4  2.659136e-17
PC5  9.556157e-04

スクリーンショット 2020-11-12 20.59.31.png

C'est devenu comme ça. Probablement parce que le vecteur propre a été inversé, il y a des endroits où le positif et le négatif sont inversés, mais je pense que le même résultat d'analyse pourrait être obtenu.

À la fin

Cette fois, j'ai écrit sur la théorie de l'analyse en composantes principales sous forme de mémorandum personnel. Je ne peux pas nier le sentiment que l'article était difficile à lire parce que j'y ai mis des preuves, mais j'ai essayé de le prouver autant que je pouvais, pensant que des gens comme moi pourraient s'inquiéter des détails et ne pourraient pas continuer.

L'analyse des composants principaux que j'ai repris cette fois-ci est facile à utiliser avec scicit-learn, donc je me sentais mal à l'aise de l'utiliser sans trop comprendre le contenu, alors j'ai senti que je pouvais le comprendre cette fois, donc j'étais rafraîchi. Cependant, à l'exception de l'implémentation dans scikit-learn, il semble qu'elle soit implémentée par décomposition en valeurs singulières. Cependant, dans le cas d'une matrice symétrique, les résultats de la décomposition des valeurs propres et de la décomposition des valeurs singulières semblent être les mêmes, j'ai donc pensé qu'il serait correct de l'appliquer à une matrice covariante distribuée ou à une matrice de corrélation comme celle-ci. Si j'ai une chance, j'aimerais étudier les avantages de l'utilisation de la décomposition de valeurs singulières autre que la généralisation.

Référence

[1] http://ibis.t.u-tokyo.ac.jp/suzuki/lecture/2015/dataanalysis/L7.pdf Analyse des données 7ème "Analyse des composants principaux" [2] https://seetheworld1992.hatenablog.com/entry/2017/03/17/104807 Prouver que la matrice distribuée co-distribuée (et la matrice de corrélation) est une valeur semi-normale

Recommended Posts

Compréhension mathématique de l'analyse en composantes principales depuis le début
Ceci et cela de l'analyse en composantes principales
[Comprendre en 3 minutes] Le début de Linux
Notes d'apprentissage depuis le début de Python 1
Omettre la nomenclature depuis le début de la chaîne
[GWAS] Tracez les résultats de l'analyse en composantes principales (ACP) par PLINK
Notes d'apprentissage depuis le début de Python 2
Trouver le début de l'avenomics à partir du grossissement NT 2
Trouver le début de l'avenomics à partir du grossissement NT 1
Le début de cif2cell
Analyse en composantes principales (Analyse en composantes principales: ACP)
Apprenez Nim avec Python (dès le début de l'année).
Étude depuis le début de Python Hour1: Hello World
Défiez l'analyse des composants principaux des données textuelles avec Python
Analyse des composants principaux à l'aide de python de nim avec nimpy
Étude de Python Hour8: Utilisation de packages
Apprendre sans enseignant 3 Analyse des principales composantes
Mise en œuvre d'une analyse de composants indépendante
Remarque DJango: depuis le début (Simplification et fractionnement d'URLConf)
Visualisez la matrice de corrélation par l'analyse des composants principaux avec Python
Début de l'analyse de l'encyclopédie Nico Nico ~ Appuyez sur les données fournies par JSON
First Python 3 ~ Le début de la répétition ~
Introduction aux bases de Python de l'apprentissage automatique (apprentissage non supervisé / analyse principale)
DJango Memo: Depuis le début (préparation)
Reconnaissance faciale à l'aide de l'analyse des composants principaux
Analyse des composants principaux avec Spark ML
[Python] Comprendre le potentiel_field_planning de Python Robotics
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
Python: apprentissage non supervisé: analyse principale
Dérivez soigneusement la plage de quadrants de la distribution normale standard depuis le début
Reconnaître le contour et la direction d'un objet façonné avec OpenCV3 et Python3 (analyse des composants principaux: PCA, vecteur propre)
Affichez le résultat de l'analyse vidéo à l'aide de l'API Cloud Video Intelligence de Colaboratory.
DJango Memo: depuis le début (réglage du modèle)
Analyse des composants principaux avec le corpus d'actualités Livedoor - Pratique--
Criez Bonjour Reiwa! Au début de Reiwa!
<Cours> Machine learning Chapitre 4: Analyse des principaux composants
Remarque DJango: depuis le début (traitement de formulaire)
Statistiques mathématiques des bases Variables probabilistes
[Python] Comparaison de la théorie de l'analyse des composants principaux et de l'implémentation par Python (PCA, Kernel PCA, 2DPCA)
Introduction aux statistiques de quiz (1) -Analyse mathématique des phrases de questions pour connaître la tendance des questions-
J'ai essayé l'analyse par grappes de la carte météo
Analyse du "XOR Network" à partir du document officiel de PyPhi
Raccourcir le temps d'analyse d'Openpose à l'aide du son
Résumé de Kaggle: Planète, comprendre l'Amazonie depuis l'espace
Analyse des composants principaux avec Livedoor News Corpus --Préparation--
Compréhension complète des concepts de Bellmanford et Dyxtra
Compression dimensionnelle par auto-encodeur et analyse des composants principaux
DJango Memo: depuis le début (création d'une vue)
J'ai essayé d'analyser les principaux composants avec les données du Titanic!
Modifiez le point décimal de la journalisation de, à.
PRML Chapitre 12 Mise en œuvre de l'analyse principale bayésienne Python
[Python] Une compréhension approximative du module de journalisation
Extrait uniquement complet du résultat de Trinity
DJango Memo: depuis le début (réglage de l'écran d'erreur)
De l'introduction de pyethapp à l'exécution du contrat
Transition du baseball vue à partir des données
Histoire de passer de Pipenv à la poésie
Résumé du début au chapitre 1 de l'introduction aux modèles de conception appris en langage Java