Python機(jī)器學(xué)習(xí)(四):PCA 主成分分析

Jacob的 Python機(jī)器學(xué)習(xí)系列:
Python機(jī)器學(xué)習(xí)(一):kNN算法
Python機(jī)器學(xué)習(xí)(二):線(xiàn)性回歸算法
Python機(jī)器學(xué)習(xí)(三):梯度下降法
Python機(jī)器學(xué)習(xí)(四):PCA 主成分分析
Python機(jī)器學(xué)習(xí)(五):SVM 支撐向量機(jī)

主成分分析法是一個(gè)非監(jiān)督的機(jī)器學(xué)習(xí)算法,主要用于數(shù)據(jù)的降維漓藕。通過(guò)降維享钞,可以發(fā)現(xiàn)更便于人類(lèi)理解的特征栗竖。


使數(shù)據(jù)映射到另一個(gè)軸上

求解目標(biāo)

主成分分析的步驟:

  1. 對(duì)樣本進(jìn)行demean處理(使所有樣本的均值為0)
  2. 取一個(gè)軸的方向 w = (w1狐肢,w2...处坪,wn)同窘,使我們的樣本想邦,映射到w之后丧没,使下式最大


    均方差

由于均值為0,則只需要使下式最大

等價(jià)

映射的過(guò)程可以如下示意

映射過(guò)程

w為單位向量夺饲,則有

向量點(diǎn)乘

則最終目標(biāo)為求取一個(gè)w擂找,使得下式最大

目標(biāo)函數(shù)

上式中為向量相乘,假設(shè)數(shù)據(jù)有n個(gè)維度慢洋,展開(kāi)來(lái)是這個(gè)樣子


展開(kāi)以便理解

那么败明,這就變成了一個(gè)目標(biāo)函數(shù)的最優(yōu)化問(wèn)題,可以使用梯度上升法解決

這個(gè)過(guò)程看起來(lái)跟線(xiàn)性回歸很像祟霍,其實(shí)是不同的沸呐,需要注意


想想其中的區(qū)別

梯度上升

梯度上升的過(guò)程與梯度下降是類(lèi)似地寓娩,需要先求導(dǎo)

沿著各個(gè)軸求導(dǎo)

像前面一樣棘伴,可以化為矩陣運(yùn)算的形式焊夸。設(shè)X為這樣的矩陣

構(gòu)造矩陣X

則求導(dǎo)可以寫(xiě)成這樣的形式。這里就不推導(dǎo)了

矩陣運(yùn)算

整理一下就是這個(gè)樣子

最終結(jié)果

求取n個(gè)主成分

上面的操作中求取w的是第一個(gè)主成分揪阶,稱(chēng)為第一主成分鲁僚。如果要求取第二主成分蕴茴,則需要將數(shù)據(jù)在第一個(gè)主成分上的分量去掉倦淀,得到的數(shù)據(jù)再求取主成分撞叽,就得到了第二主成分愿棋。

綠色的向量就是第二主成分的數(shù)據(jù)

比如說(shuō)有這么一個(gè)數(shù)據(jù)集

使用numpy生成一個(gè)數(shù)據(jù)集

找到第一主成分的方向w1才睹。將數(shù)據(jù)在第一主成分上的分量去掉琅攘,得到的數(shù)據(jù)如下坞琴。再求取一次主成分剧辐,就得到了第二主成分的方向荧关。


第二個(gè)主成分的數(shù)據(jù)

假設(shè)我們找到了k個(gè)主成分的方向褂傀,如果想將數(shù)據(jù)從n維映射到k維(n>k)紊服,則可以如下進(jìn)行欺嗤。令Wk為計(jì)算出的k個(gè)主成分的方向。


圖沒(méi)弄好

則可以進(jìn)行矩陣運(yùn)算進(jìn)行降維讹挎。X有m個(gè)樣本n個(gè)方向马篮,映射后有m個(gè)樣本k個(gè)方向


想象一下

同樣浑测,可以將映射到低維的數(shù)據(jù)重映射到高維迁央,但是會(huì)損失一些信息滥崩,結(jié)果跟原來(lái)是不一樣的

重映射

編程實(shí)現(xiàn)

"""
Created by 楊幫杰 on 11/4/2018
Right to use this code in any way you want without
warranty, support or any guarantee of it working
E-mail: yangbangjie1998@qq.com
Association: SCAU 華南農(nóng)業(yè)大學(xué)
"""
import numpy as np

class PCA:

    def __init__(self, n_components):
        """初始化PCA"""
        assert n_components >= 1, "n_components must be valid"
        self.n_components = n_components
        self.components_ = None

    def fit(self, X, eta=0.01, n_iters=1e4):
        """獲得數(shù)據(jù)集的前n個(gè)主成分"""
        assert self.n_components <= X.shape[1], \
            "n_components must not be greater than the feature number of X"

        def demean(X):
            return X - np.mean(X, axis=0)

        def f(w, X):
            return np.sum((X.dot(w) ** 2)) / len(X)

        def direction(w):
            return w / np.linalg.norm(w)

        def first_components(X, initial_w, eta=0.01, n_iters=1e4, epsilon=1e-8):
            w = direction(initial_w)
            cur_iter = 0

            while cur_iter < n_iters:
                gradient = df(w, X)
                last_w = w
                w = w + eta*gradient
                w = direction(w)
                if(abs(f(w, X) - f(last_w, X)) < epsilon):
                    break
                cur_iter += 1

            return w

        X_pca = demean(X)
        self.components_ = np.empty(shape=(self.n_components, X.shape[1]))
        for i in range(self.n_components):
            initial_w = np.random.random(X_pca.shape[1])
            w = first_components(X_pca, initial_w, eta, n_iters)
            self.components_[i,:] = w
            X_pca = X_pca - X_pca.dot(w).reshape(-1,1) * w

        return self

    def transform(self, X):
        """將給定的X,映射到各個(gè)主成分分量中"""
        assert X.shape[1] == self.components_.shape[1]

        return X.dot(self.components_.T)

    def inverse_transform(self, X):
        """將給定的X短条,反向映射回原來(lái)的特征空間"""
        assert X.shape[1] == self.components_.shape[0]

        return X.dot(self.components_)

    def __repr__(self):
        return "PCA(n_components = %d" % self.n_components

References:
Python3 入門(mén)機(jī)器學(xué)習(xí) 經(jīng)典算法與應(yīng)用 —— liuyubobobo
機(jī)器學(xué)習(xí)實(shí)戰(zhàn) —— Peter Harrington

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逐抑,一起剝皮案震驚了整個(gè)濱河市屹蚊,隨后出現(xiàn)的幾起案子汹粤,更是在濱河造成了極大的恐慌嘱兼,老刑警劉巖贤徒,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踢涌,死亡現(xiàn)場(chǎng)離奇詭異序宦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)行剂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)厚宰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)固阁,“玉大人城菊,你說(shuō)我怎么就攤上這事凌唬。” “怎么了况褪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵测垛,是天一觀的道長(zhǎng)食侮。 經(jīng)常有香客問(wèn)我目胡,道長(zhǎng),這世上最難降的妖魔是什么眉尸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任噪猾,我火速辦了婚禮袱蜡,結(jié)果婚禮上戒劫,老公的妹妹穿的比我還像新娘。我一直安慰自己巫橄,他們只是感情好湘换,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布彩倚。 她就那樣靜靜地躺著帆离,像睡著了一般哥谷。 火紅的嫁衣襯著肌膚如雪麻献。 梳的紋絲不亂的頭發(fā)上勉吻,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天惑惶,我揣著相機(jī)與錄音源譬,去河邊找鬼踩娘。 笑死喉祭,一個(gè)胖子當(dāng)著我的面吹牛泛烙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藐唠,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼踪宠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柳琢!你這毒婦竟也來(lái)了润脸?” 一聲冷哼從身側(cè)響起毙驯,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涩馆,失蹤者是張志新(化名)和其女友劉穎魂那,沒(méi)想到半個(gè)月后涯雅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體活逆,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔗候,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了埂软。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锈遥。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖勘畔,靈堂內(nèi)的尸體忽然破棺而出所灸,到底是詐尸還是另有隱情,我是刑警寧澤炫七,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布爬立,位于F島的核電站,受9級(jí)特大地震影響万哪,放射性物質(zhì)發(fā)生泄漏侠驯。R本人自食惡果不足惜抡秆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一琅轧、第九天 我趴在偏房一處隱蔽的房頂上張望效床。 院中可真熱鬧憋沿,春花似錦运嗜、人聲如沸砸民。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至锐峭,卻和暖如春矛渴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揖铜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萄焦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓萧恕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氮唯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容