Kysymys:
Painotettu pääkomponenttien analyysi
noname
2014-08-28 00:46:00 UTC
view on stackexchange narkive permalink

Havaittuani jonkin verran havainnointia havaintopainojen / mittausvirheiden sisällyttämisestä pääkomponenttien analyysiin. Minun mielestäni on tapana luottaa iteratiivisiin lähestymistapoihin painotusten sisällyttämiseksi (esim. täällä). Kysymykseni on, miksi tämä lähestymistapa on tarpeen? Miksi emme voi käyttää painotetun kovarianssimatriisin ominaisvektoreita?

Alla olevien vastausten lisäksi katso säie http://stats.stackexchange.com/q/141754/3277, jossa painotetun PCA: n (painot sarakkeissa ja / tai riveillä) selitetään ensisijaisesti vastaavan painotettua (yleistetty) svd / biplot.
Kaksi vastused:
amoeba
2014-08-28 01:41:27 UTC
view on stackexchange narkive permalink

Se riippuu siitä, mihin painosi tarkalleen liittyvät.

Rivipainot

Anna $ \ mathbf {X} $ span > olla tietomatriisi, jossa on muuttujia sarakkeissa ja $ n $ havaintoja $ \ mathbf x_i $ riveillä. Jos jokaisella havainnolla on liitetty paino $ w_i $ , näiden painojen sisällyttäminen PCA: han on todellakin suoraviivaista.

Ensin täytyy laskea painotettu keskiarvo $ \ boldsymbol \ mu = \ frac {1} {\ summa w_i} \ summa w_i \ mathbf x_i $ ja vähennä se tiedoista, jotta keskitä se.

Sitten lasketaan painotettu kovarianssimatriisi $ \ frac {1} {\ sum w_i} \ mathbf X ^ \ top \ mathbf W \ mathbf X $ , jossa $ \ mathbf W = \ operaattorin nimi {diag} (w_i) $ on painojen diagonaalimatriisi ja käytä standardi PCA analysoimaan sitä.

Solupainot

Löytämäsi Tamuz et al., 2013 -artikkelissa pidetään monimutkaisempana tapauksena, kun eri painot $ w_ {ij} $ käytetään jokaiseen tietomatriisin elementtiin . Sitten ei todellakaan ole analyyttistä ratkaisua, ja on käytettävä iteratiivista menetelmää. Huomaa, että kuten kirjoittajat tunnustavat, he keksivät pyörän uudelleen, koska tällaisia ​​yleisiä painoja on varmasti harkittu aiemmin, esim. julkaisussa Gabriel ja Zamir, 1979, Matriisien matalampi arviointi lähinnä neliöitä millä tahansa painovalinnalla. Tästä keskusteltiin myös täällä.

Lisähuomautuksena: jos painot $ w_ {ij} $ vaihtelevat sekä muuttujat että havainnot, mutta ovat symmetrisiä, joten $ w_ {ij} = w_ {ji} $ , niin analyyttinen ratkaisu on taas mahdollista, katso Koren ja Carmel, 2004, vankka lineaarisen ulottuvuuden pienennys.

Kiitos selvennyksestä.Voitteko selittää, miksi mikään analyyttinen ratkaisu ei ole mahdollista diagonaalisten painojen kanssa?Tämän puuttuu sekä Tamuz et al 2013: sta että Gabrielista ja Zamirista 1979.
@noname: En ole tietoinen tällaisesta todisteesta, enkä myöskään olisi yllättynyt, jos sitä ei tiedettäisi.On yleensä melko hankalaa todistaa, että jokin ei ole * mahdotonta *, erityisesti, että jokin ei ole mahdollista analyyttisesti.Kulman kolmileikkauksen mahdottomuus odotti tunnetusti sen todistusta yli 2000 vuotta ... (jatkuu)
@noname: (jatkuu) Kysymyksesi on osoittaa, että $ \ sum_ {i, j} w_ {ij} (X_ {ij} - A_ {ij}) ^ 2 $: n minimoinnin ongelma $ A $: n suhteen on rajoitettuolla alhainen sijoitus $ q $.ei voida pelkistää ominaisvektoriongelmaksi.Pelkään, että tarvitset toisen foorumin (ehkä mathoverflow?).Mutta huomaa, että ominaisvektorien löytäminen ei myöskään ole tarkalleen * analyyttinen * ratkaisu: vain [iteraatiot] (http://en.wikipedia.org/wiki/Power_iteration) suoritetaan yleensä äänettömästi tavallisella kirjastofunktiolla.
+1.Vastauksen ensimmäinen osa voidaan käsitteellistää myös painotetun (yleistetyn) Biplotin suhteen [tässä] kuvatulla tavalla (http://stats.stackexchange.com/a/141755/3277).Pidä mielessä, kuinka PCA on "erityistapaus" Biplotista (koskee myös riviviivaa).
@ttnphns: Kun kommenttisi ja toinen ketju on suljettu kopiona, luin vastaukseni uudelleen ja laajensin selitystä rivipainojen käsittelemisestä.Mielestäni aiemmin se ei ollut täysin oikea tai ainakaan ollut täydellinen, koska en maininnut keskittämistä painotetulla keskiarvolla.Toivon, että sillä on järkevämpää nyt!
voinko kysyä, miksi X⊤WX jaetaan (n − 1) painojen summan sijasta?Rivi-menetelmä
Jos X on mxn-matriisi, käyttäen yllä olevaa kaavaa, lopullinen painotettu kovarianssimatriisi on nxn - onko tämä oikein?[(nxm) (mxm) (mxn)].Eikö lopullisen painotetun kovarianssimatriisin tulisi olla mxn ja suorittaa sitten normaali PCA?
@Zeus $ n \ kertaa p $ -datamatriisille kovarianssimatriisi on aina $ p \ kertaa p $, painotettu tai painottamaton.Kun kirjoitin "käytä standardia PCA: ta" tarkoitin "tee ominaisvektorin hajoaminen jne."
Kiitos selvennyksestä.Olen hämmentynyt lukiessani tätä asiakirjaa https://www.researchgate.net/publication/220869008_Point_cloud_denoising_using_robust_principal_component_analysis, jossa he juurruttavat kovarianssimatriisin painot (osa 4).Miksi käyttää neliön juuria painoja?
fr_andres
2018-03-10 09:30:41 UTC
view on stackexchange narkive permalink

Kiitos paljon ameebaa rivipainoja koskevasta oivalluksesta. Tiedän, että tämä ei ole päällekytkentä, mutta minulla oli vaikeuksia löytää rivipainotetun PCA: n toteutus selityksineen, ja koska tämä on yksi ensimmäisistä tuloksista painotettua PCA: ta googlattaessa, ajattelin, että olisi hyvä liittää ratkaisuni , ehkä se voi auttaa muita samassa tilanteessa. Tässä Python2-koodinpätkässä PCA: ta, joka on painotettu edellä kuvatulla RBF-ytimellä, käytetään 2D-tietojoukon tangenttien laskemiseen. Olen iloinen kuullessani palautetta!

  def weighted_pca_regression (x_vec, y_vec, painot):
    "" "
    Annetaan kolme reaaliarvotettua yhtä pitkää vektoria, jotka vastaavat koordinaatteja
    2-ulotteisen tietojoukon ja painon mukaan tämä toiminto antaa kulman radiaaneina
    linjan (painotetun) keskiarvon ja lineaarisen pääkomponentin kanssa
    tiedot. Tätä varten lasketaan ensin painotettu keskiarvo ja kovarianssimatriisi.
    Sitten suoritetaan u, e, v = svd (cov) ja u * f (x) = 0 ratkaistaan.
    "" "
    input_mat = np.pino ([x_vec, y_vec])
    painot_summa = painot.sum ()
    # Vähennä (painotettu) keskiarvo ja laske (painotettu) kovarianssimatriisi:
    mean_x, mean_y = weights.dot (x_vec) / weights_sum, weights.dot (y_vec) / weights_sum
    keskitetty_x, keskitetty_y = x_vec-keskiarvox, y_vec-keskiarvo_y
    matrix_centered = np.pino ([keskitetty_x, keskitetty_y])
    painotettu_kov = matriisi_keskitetty.dot (np.diag (painot) .dot (matriisi_keskitetty.T)) / painojen_summa
    # Tiedämme, että v kiertää datan pääkomponentin y = 0-akselille ja
    # että u kiertää sitä takaisin. U.dot ([x, 0]) = [x * u [0,0], x * u [1,0]] ratkaisemalla saadaan
    # f (x) = (u [1,0] / u [0,0]) x rekonstruoituna funktiona.
    u, e, v = np.linalg.svd (painotettu_kov)
    palauta np.arctan2 (u [1,0], u [0,0]) # arctan vakaampi kuin jakaminen


# KÄYTTÖESIMERKKI:
# Määritä ydin ja tee ellipsi regressiolle:
rbf = lambda vec, stddev: np.exp (-0,5 * np.power (vec / stddev, 2))
x_span = np.linspace (0, 2 * np.pi, 31) +0,1
data_x = np.cos (x_span) [: - 1] * 20-1000
data_y = np.sin (x_span) [: - 1] * 10 + 5000
data_xy = np.pino ([data_x, data_y])
stddev = 1 # 1: n stddev on tässä yhteydessä erittäin paikallista
keskukselle data_xy.T:
    # paino pisteet niiden euklidisen etäisyyden perusteella nykyiseen keskukseen
    euklidiset etäisyydet = np.linalg.norm (data_xy.T-keskus, akseli = 1)
    painot = rbf (euklidiset etäisyydet, stddev)
    # saat regressiokulman radiaaneina
    p_grad = painotettu_pca_regressio (data_x, data_y, painot)
    # juoni havainnollistamista varten
    line_x = np.linstila (-5,5,10)
    viiva_y = np.tan (p_grad) * viiva_x
    plt.plot (viiva_x + keskiö [0], viiva_y + keskiö [1], c = "r")
    plt.scatter (* data_xy)
    plt.show ()
 

Ja näyteuloste (se tekee saman jokaiselle pisteelle): enter image description here

Kippis,
Andres



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...