2016-06-09 3 views
2

Ich verwende sklearns PCA Funktion für einige Daten, die ich analysieren möchte, und ich habe Probleme herauszufinden, wie genau ich das brauche transformiere skalierte Daten zurück in Zahlen, die im Zusammenhang mit dem, was ich gerade mache, sinnvoll sind. Genauer gesagt, wenn ich laufe:Erklären des Unterschieds zwischen sklearn's scale() und Multiplikation mit STD und Addieren des Mittelwerts

import pandas as pd 
import numpy as np 

from sklearn.preprocessing import scale 

X_scaled = scale(otr_df) 

X_scaled2 = otr_df.sub(otr_df.mean()) 
X_scaled2 = X_scaled2.div(otr_df.std()) 

# Should print all zeroes 
print (X_scaled - X_scaled2)/X_scaled 

""" 
The above prints the following: 

Date    Index1   Index2   Index3   Index4 
2016-05-11  0.000706  0.000706   0.000706  0.000706 ... 
2016-05-10  0.000706  0.000706   0.000706  0.000706 ... 
2016-05-09  0.000706  0.000706   0.000706  0.000706 ... 
2016-05-06  0.000706  0.000706   0.000706  0.000706 ... 
.     .    .     . 
.     .    .     . 
.     .    .     . 
""" 

Statt Null (wie ich erwarten würde), ich für jede Spalte konstante Werte von 0,000706 bin immer, wenn in der unteren Zeile des obigen Codes gedruckt wird. Obwohl klein, scheint es nicht trivial zu sein, wenn ich mich mit mehreren tausend multipliziere, um zur ursprünglichen Skala zurückzukehren (was ich in einigen Fällen bin). Meine Vermutung ist, dass es mit der Division durch (N - 1) anstelle von N oder etwas in dieser Richtung zu tun hat. Nachdem ich zu viel Zeit damit verbracht habe, Sklearn- und Pandas-Dokumente zu lesen, ohne dafür etwas zu zeigen, dachte ich, dass ich hier fragen würde, ob jemand eine Idee hätte.

Antwort

2

sklearn verwendet null Freiheitsgrade in ihrer Standardabweichung Berechnung:

import pandas as pd 
import numpy as np 

from sklearn.preprocessing import scale 

np.random.seed([3,1415]) 
otr_df = pd.DataFrame(np.random.rand(10, 10)) 
X_scaled = scale(otr_df) 

X_scaled2 = otr_df.sub(otr_df.mean()) 
X_scaled2 = X_scaled2.div(otr_df.std(ddof=0)) 
#         ^
#     Specify ddof here | 

# Should print all zeroes 
print (X_scaled - X_scaled2)/X_scaled 

    0 1 2 3 4 5 6 7 8 9 
0 -0.0 -0.0 -0.0 -0.0 0.0 -0.0 0.0 0.0 0.0 0.0 
1 0.0 0.0 0.0 0.0 0.0 -0.0 -0.0 -0.0 -0.0 -0.0 
2 -0.0 0.0 -0.0 0.0 0.0 0.0 0.0 -0.0 -0.0 -0.0 
3 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 
4 0.0 -0.0 0.0 -0.0 -0.0 0.0 0.0 0.0 0.0 0.0 
5 -0.0 -0.0 0.0 0.0 -0.0 0.0 0.0 -0.0 0.0 0.0 
6 0.0 -0.0 0.0 0.0 -0.0 -0.0 0.0 0.0 0.0 0.0 
7 -0.0 -0.0 -0.0 0.0 -0.0 -0.0 -0.0 0.0 0.0 -0.0 
8 0.0 0.0 -0.0 -0.0 -0.0 0.0 -0.0 -0.0 0.0 -0.0 
9 0.0 0.0 -0.0 -0.0 0.0 -0.0 -0.0 -0.0 -0.0 -0.0 
+0

Ahh, ich wusste, dass es etwas mit den Freiheitsgraden zu tun wäre. Danke für die Antwort. – weskpga