Scikit-learn: Unerwartetes Verhalten der kanonischen Korrelationsanalyse (CCA)

Erstellt am 23. Juni 2019  ·  3Kommentare  ·  Quelle: scikit-learn/scikit-learn

Wenn Ihr Problem eine Nutzungsfrage ist, senden Sie sie stattdessen hier: - StackOverflow mit dem scikit-learn-Tag: https://stackoverflow.com/questions/tagged/scikit-learn - Mailing List: https://mail.python.org /mailman/listinfo/scikit-learn Weitere Informationen finden Sie unter Benutzerfragen: http://scikit-learn.org/stable/support.html#user-questions Anleitung zum Einreichen eines Fehlers: https://github.com/scikit -learn/scikit-learn/blob/master/CONTRIBUTING.md#filing-bugs

Beschreibung

Bei zwei Ansichtsmatrizen X und Y sollte CCA die n_components Linearkombinationen der Elemente in X und Y s Vektoren mit der größten Korrelation, dh die erste Komponente hat die größte Korrelation, die zweite hat die zweitgrößte Korrelation in eine Richtung, die mit der ersten nicht korreliert ist usw. Im folgenden Code sind die zweiten Spalten jedoch eindeutig weniger korreliert als die dritte Spalte:

Schritte/Code zum Reproduzieren

from sklearn.cross_decomposition import CCA
import numpy as np
from scipy import stats

X = [[0.006061109337620652, 0.0392466675239141, -0.04312459861840733], [-0.6652995467596429, 0.2076410843346226, -0.7817536882379651], [-1.4060868112838942, -0.055029478343267685, -1.006415484608637], [-2.170613455952169, -0.15770102997315535, -1.5223958036356375], [-2.895702070412092, -0.20498481413822175, -1.8232022285963847], [-3.687452614812402, -0.543003880524402, -2.2952030829468533], [-4.206168972149556, -0.3365693935548624, -2.841946351795423], [-5.231288268781064, -0.8024321344988571, -3.40532581256557], [-6.095805742721522, -0.9381144689340173, -3.593752186094848], [-6.297988264542059, -0.7231985020991631, -3.9435579269998406], [-7.10897027952524, -0.8639925998765747, -4.264992629284153], [-8.116238092376772, -1.0123970020855437, -4.96858178622968], [-8.969468878952105, -1.0235782019578692, -5.617282941713933], [-9.839359511108077, -1.2819621078971968, -5.8901943190245625], [-10.181936322525571, -0.9904671991812529, -6.240811384647836]]
Y = [[0.032927114749911154, 0.21320841666565743, -0.23427536580450153], [1.431742605643286, 0.23963850202268067, 0.8438745303679628], [2.908798834568648, 0.7357229001312737, 1.325345683629048], [4.438824821921929, 0.9473643810538429, 2.35038560647864], [5.887201894166226, 1.0302756424934638, 2.964806513433767], [7.409049064480012, 1.3070946380395154, 4.347473875547982], [8.51501831350366, 1.3380108570442941, 4.9533251686263275], [10.57244384646805, 2.31627294094068, 6.028949244604159], [12.22872203222364, 2.1165257564864675, 6.923464021607424], [12.664660419747504, 1.8911363532121173, 7.398432173930664], [14.29235367239137, 2.2098221962551343, 8.000538342827351], [16.327977920399373, 2.643183255720207, 9.257671785118596], [18.081288169620517, 2.968898443090926, 10.221747267811098], [19.754046559146662, 3.051682253577557, 11.244435627784393], [20.466418131910004, 2.644933083198568, 11.752014917896375]]

cca = CCA(n_components=3)
cca.fit(X, Y)
X_transformed, Y_transformed = cca.transform(X, Y)

print(X_transformed)

[[ 1.64277244  0.08237031  0.11724683]
 [ 1.41457457 -0.11600721  0.07162219]
 [ 1.18686358  0.00666119  0.08822118]
 [ 0.94070119 -0.02504267 -0.0112954 ]
 [ 0.71314666  0.02919558  0.25990473]
 [ 0.46246267  0.05607036 -0.16424275]
 [ 0.28625435 -0.09546609 -0.02850206]
 [-0.03644528 -0.03407977 -0.55790786]
 [-0.30127324  0.12266269 -0.12622283]
 [-0.37581414 -0.01941656 -0.0343278 ]
 [-0.62900674  0.05973748  0.13448604]
 [-0.95400947  0.0082079  -0.05487306]
 [-1.23214839 -0.07548718 -0.08864002]
 [-1.50031366  0.05776429  0.00665019]
 [-1.61776455 -0.0571703   0.38788062]]

print(Y_transformed)

[[ 1.64131294  0.01428169  0.11343087]
 [ 1.41330957 -0.06169376  0.06929115]
 [ 1.18580457  0.04946041  0.0853499 ]
 [ 0.9398609   0.01613582 -0.01092778]
 [ 0.71251056  0.06356946  0.25144578]
 [ 0.46205587 -0.05371303 -0.15889725]
 [ 0.28599564 -0.05298207 -0.02757442]
 [-0.03641563  0.02220818 -0.53975   ]
 [-0.30099795  0.01004611 -0.12211474]
 [-0.37547807 -0.063071   -0.03321056]
 [-0.62844374  0.02679924  0.13010901]
 [-0.95315959  0.0185694  -0.05308714]
 [-1.23105629  0.03726576 -0.08575511]
 [-1.49897395  0.01483407  0.00643375]
 [-1.61632484 -0.04171028  0.37525653]]

erwartete Ergebnisse

Die Korrelation zwischen den dritten Spalten von X_transfomed und Y_transformed beträgt ungefähr 1, während die Korrelation zwischen den zweiten Spalten nur 0,389 beträgt. Daher habe ich erwartet, dass die dritte Spalte anstelle der zweiten Spalte erscheint.

Tatsächliche Ergebnisse

Wenn ich CCA mit n_components=2 ausführe, bekomme ich die erste und zweite Spalte, während ich die erste und die dritte hätte bekommen sollen.

Versionen

Linux-4.13.0-16-generic-x86_64-with-Ubuntu-17.10-artful
Python 3.6.3 (Standard, 3. Oktober 2017, 21:45:48)
NumPy 1.14.3
SciPy 1.2.0
Scikit-Lernen 0.19.1

Danke fürs Mitmachen!

Alle 3 Kommentare

Ich will nicht unhöflich sein, aber was ist der Zweck davon. Warum tust du das?

Ich tue dies, um die gemeinsamen Komponenten zwischen zwei Ansichten einiger Daten zu erhalten.

So setzen Sie einen Schwellenwert mit cca

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen