2017-06-19 5 views
0

Ich verwende das PCA-Modul von sklearn. Ich verwende den folgenden Code, um die Analyse einzurichten.Python sklearn PCA.explained_variance_ratio_ ergibt nicht 1

from sklearn.decomposition import PCA 
pca = PCA(n_components=9) 
p = pca.fit([row[:-1] for row in norm]) 

norm hier ist mein normalisierte Datensatz mit einer eindeutigen Kennung in der letzten Spalte, weshalb ich es in der letzten Zeile bin zu entfernen. Es gibt 9 Funktionen in diesem Datensatz, so würde ich mit 9 Komponenten erwarten, dass es keine unerklärte Varianz geben würde. Als ich p.explained_variance_.cumsum() aber nennen, die ich erhalten:

[ 0.06589563 0.08608778 0.09578116 0.10150195 0.10703567 0.11036608 
    0.11241904 0.11422285 0.11591605] 

Bin ich etwas über PCA Missverständnis? Ich habe dieses Modul vorher ohne Problem verwendet, aber es ist eine Weile her. Richte ich das falsch aus? Ich habe meine Daten von irgendwelchen identifizierenden Informationen entfernt, um sie hier zu veröffentlichen. Unten ist eine Teilmenge der Daten, die das Problem zu reproduzieren scheinen. Hier

[0.3888888888888889, 0.3888888888888889, 0.3888888888888889, 0.436943311456892, 0.7905900031193156, 0.5020468092219706, 0.8389717734280283, 0.7604923090797432, 0.8206054422776056, '0'] 
[0.3888888888888889, 0.3888888888888889, 0.2222222222222222, 0.4457200178477334, 0.8114779465247448, 0.506899600792241, 0.8368566485573798, 0.760617288778523, 0.8195489478905984, '1'] 
[0.2777777777777778, 0.2777777777777778, 0.05555555555555555, 0.4426231291814084, 0.7883413226205706, 0.5037172133121759, 0.8370362549229062, 0.7599752704033258, 0.8184218722901648, '2'] 
[0.1111111111111111, 0.1111111111111111, 0.16666666666666666, 0.4651807845446571, 0.7983379003654792, 0.5250604537887904, 0.8463875215362144, 0.7533582308429306, 0.8241548325954007, '3'] 
[0.5000000000000001, 0.5000000000000001, 0.3333333333333333, 0.4457200178477334, 0.7878040593905666, 0.506899600792241, 0.8368566485573798, 0.7605016058324149, 0.8195489478905984, '4'] 
[0.3888888888888889, 0.3888888888888889, 0.2222222222222222, 0.44943322185630036, 0.7843622888520198, 0.5055757644148106, 0.8351253941103399, 0.7604171267769607, 0.8185442945328569, '5'] 
[0.3888888888888889, 0.3888888888888889, 0.3333333333333333, 0.4424914587425397, 0.7877430312713435, 0.5029950110274568, 0.836692391332608, 0.760611529525946, 0.8198150075184326, '6'] 
[0.3333333333333333, 0.05555555555555555, 0.7777777777777778, 0.4389415113841421, 0.7878040593905666, 0.506899600792241, 0.8368566485573798, 0.7605016058324149, 0.8195489478905984, '7'] 
[0.4444444444444444, 0.4444444444444444, 0.4444444444444444, 0.42770705188736874, 0.7976039510596705, 0.5057230657076256, 0.8368566485573798, 0.7605016058324149, 0.8195489478905984, '8'] 
[0.2222222222222222, 0.2777777777777778, 0.5000000000000001, 0.43182322765312314, 0.7971732873351607, 0.5072390458086798, 0.84541364942531, 0.7613416598875292, 0.8239037851005895, '9'] 
+0

Die Frage passt hier besser als in der CV-Community. Ich frage mich, was der Zweck von 'p = pca.fit ([row [: - 1] für Zeile in der Norm])' ist. – Toni

+0

Ich postete dort auch, entschied schließlich, dass dies der bessere Ort war, weil die Wurzel des Problems, denke ich, mehr mit meinem Code als mit der Theorie ist – bendl

+0

Ja, kein Problem. Ich bin nicht groß auf Formulare und wusste nicht, wo ich meine Antwort posten sollte. Wahrscheinlich sollten Sie in Erwägung ziehen, Ihren Beitrag in beiden Communities zu löschen. Ich sehe, dass Sie einen Teil des Datensatzes gepostet haben, aber ich hatte keine Chance, damit zu spielen. – Toni

Antwort

1

Amoeba auf CV-Stack-Austausch gab mir die Antwort am Ende - es war ein einfacher Tippfehler. Ich rief p.explained_variance_.cumsum(), aber der richtige Methodenaufruf war p.explained_variance_ratio_.cumsum(). Natürlich muss die Varianz nicht zu eins addiert werden!

+0

Ich bin froh, dass du deine Antwort bekommen hast ... Richtig ... es ist der Prozentsatz der Varianz, der erklärt wird ... – Toni

2

ist ein Beispiel mit dem Iris-Datensatz mit einem Screeplot:

enter image description here


versuchen, Ihr Problem mit dem Datensatz zu reproduzieren Sie gerade geschrieben:

d = matrix([[0.3888888888888889, 0.3888888888888889, 0.3888888888888889, 0.436943311456892, 0.7905900031193156, 0.5020468092219706, 0.8389717734280283, 0.7604923090797432, 0.8206054422776056, '0'], 
[0.3888888888888889, 0.3888888888888889, 0.2222222222222222, 0.4457200178477334, 0.8114779465247448, 0.506899600792241, 0.8368566485573798, 0.760617288778523, 0.8195489478905984, '1'], 
[0.2777777777777778, 0.2777777777777778, 0.05555555555555555, 0.4426231291814084, 0.7883413226205706, 0.5037172133121759, 0.8370362549229062, 0.7599752704033258, 0.8184218722901648, '2'], 
[0.1111111111111111, 0.1111111111111111, 0.16666666666666666, 0.4651807845446571, 0.7983379003654792, 0.5250604537887904, 0.8463875215362144, 0.7533582308429306, 0.8241548325954007, '3'], 
[0.5000000000000001, 0.5000000000000001, 0.3333333333333333, 0.4457200178477334, 0.7878040593905666, 0.506899600792241, 0.8368566485573798, 0.7605016058324149, 0.8195489478905984, '4'], 
[0.3888888888888889, 0.3888888888888889, 0.2222222222222222, 0.44943322185630036, 0.7843622888520198, 0.5055757644148106, 0.8351253941103399, 0.7604171267769607, 0.8185442945328569, '5'], 
[0.3888888888888889, 0.3888888888888889, 0.3333333333333333, 0.4424914587425397, 0.7877430312713435, 0.5029950110274568, 0.836692391332608, 0.760611529525946, 0.8198150075184326, '6'], 
[0.3333333333333333, 0.05555555555555555, 0.7777777777777778, 0.4389415113841421, 0.7878040593905666, 0.506899600792241, 0.8368566485573798, 0.7605016058324149, 0.8195489478905984, '7'], 
[0.4444444444444444, 0.4444444444444444, 0.4444444444444444, 0.42770705188736874, 0.7976039510596705, 0.5057230657076256, 0.8368566485573798, 0.7605016058324149, 0.8195489478905984, '8'], 
[0.2222222222222222, 0.2777777777777778, 0.5000000000000001, 0.43182322765312314, 0.7971732873351607, 0.5072390458086798, 0.84541364942531, 0.7613416598875292, 0.8239037851005895, '9']]) 

enter image description here