0
votes

Comment calculer la matrice de covariance de la trame de données

J'ai lu la trame de données des données du capteur, en utilisant la fonction pandas read_fwf. J'ai besoin de trouver la matrice de covariance de la matrice de lecture 928991 x 8. Finalement, Je veux trouver des vecteurs propres et des valeurs propres, en utilisant l'algorithme d'analyse en composantes principales pour cette matrice de covariance.


4 commentaires

Il n'y a pas de fonction dans les pandas pour calculer la matrice de covariance. Cependant, il existe une fonction pour une matrice de corrélation. Peut-être que vous pourriez utiliser celui-là?


Il y a une différence entre la matrice de la covariance et la matrice de corrélation. Bien que la PCA puisse être faite sur les deux. La matrice de covariance est utilisée lorsque les échelles variables sont similaires et que la matrice de corrélation est utilisée lorsque des variables sont sur différentes échelles. Je préférerais utiliser une matrice de covariance dans ce scénario, car les données de 8 capteurs sont à la même échelle.


Si vous multipliez la matrice de corrélation en ligne et en columbwuse par les variances, ne deviendra-t-elle pas une matrice de covariance?


@DYZ Oui, mais pourquoi ne pas simplement utiliser pd.DataFrame.cov ?


3 Réponses :


2
votes

Tout d'abord, vous devez placer le dataframe pandas dans un tableau numpy en utilisant df.values ​​. Par exemple:

# import functions you need to compute covariance matrix from numpy
from numpy import array
from numpy import mean
from numpy import cov
from numpy.linalg import eig

# assume you load your data using pd.read_fwf to variable *df*
df = pd.read_fwf(filepath, widths=col_widths, names=col_names)
#put dataframe values to a numpy array
A = df.values
#check matrix A's shape, it should be (928991, 8)
print(A.shape)
# calculate the mean of each column
M = mean(A.T, axis=1)
print(M)
# center columns by subtracting column means
C = A - M
print(C)
# calculate covariance matrix of centered matrix
V = cov(C.T)
print(V)
# eigendecomposition of covariance matrix
values, vectors = eig(V)
print(vectors)
print(values)
# project data
P = vectors.T.dot(C.T)
print(P.T)

Il serait beaucoup plus facile de calculer la matrice de covariance ou l'ACP après avoir placé vos données dans un tableau numpy. Pour en savoir plus:

A = df.values

L'exécution de l'exemple imprime d'abord la matrice d'origine, puis les vecteurs propres et les valeurs propres de la matrice de covariance centrée puis enfin la projection de la matrice d'origine. Voici un lien que vous pourriez trouver utile pour votre tâche PCA .


2 commentaires

Salut Merci pour votre réponse. Mais l'impression de A = df.values ​​consomme beaucoup de mémoire et prend du temps pour imprimer A. Cela peut être dû au fait que la trame de données d'origine a 928991 lignes.


Si vous ne pouvez pas lire le fichier directement dans un tableau, vous pouvez également essayer d'utiliser une méthode de segmentation pour concaténer les morceaux de read_fwf vers un tableau à l'aide d'un itérateur. comme: 'read_fwf (...., chunksize = 1000000)'



1
votes

Pourquoi pas simplement utiliser le pd.dataframe.cov fonction ?


7 commentaires

Salut gmds, La trame de données est 928991 x 12, où 12 colonnes sont id, heure, R1, R2 ... R8, température, humidité. La matrice de covariance doit être calculée pour les colonnes R1, R2, R3 ... R8, soit 928991 x 8. L'utilisation de pd.DataFrame.cov a renvoyé une matrice 4 x 4, avec id, heure, R1, humidité.


@Yatshan Vos colonnes sont-elles toutes de type numérique? S'ils sont omis, cela suggère qu'ils sont de type objet .


Qu'entend-on par type d'objet? Les données dont je parle proviennent du lien suivant. archive.ics.uci.edu/ml/datasets/...


@Yatshan Vérifiez df.dtypes .


Il a renvoyé le id int64 temps float64 R1 float64 R2 objet R3 objet R4 objet R5 objet R6 objet R7 objet R8 objet Temp. objet Humidité float64 dtype: objet


Oui, donc comme je l'ai dit, vos colonnes sont de type object . Il est logique de calculer la covariance des nombres. Vous devez d'abord effectuer une conversion.


J'ai converti des données avec le type d'objet float64, en utilisant notna (). Astype ('float64'). Supprimez ensuite les deux premières colonnes et les deux dernières colonnes pour obtenir une matrice de 928991 x 8. J'ai appliqué pd.DataFrame.cov avec une matrice modifiée, il renvoie une matrice de covariance 1 x 1.



0
votes

La réponse à cette question serait la suivante

import pandas as pd
import numpy as np
from numpy.linalg import eig

df_sensor_data = pd.read_csv('HT_Sensor_dataset.dat', delim_whitespace=True)
del df_sensor_data['id']
del df_sensor_data['time']
del df_sensor_data['Temp.']
del df_sensor_data['Humidity']
df = df_sensor_data.notna().astype('float64')
covariance_matrix = df_sensor_data.cov()
print(covariance_matrix)

values, vectors = eig(covariance_matrix)
print(values)
print(vectors)


0 commentaires