【機器學習實踐】主成分分析及相關(guān)

主成分分析

原理

通俗地講腔召,主成分分析(PCA)的原理是數(shù)據(jù)集旋轉(zhuǎn)(可以是高維)后,使前面的特征對應(yīng)的值的方差盡量大请祖,只取前面若干個特征達到降維的目的馒疹。
方法:求出數(shù)據(jù)集的散度矩陣,求出它的特征值和特征向量滔韵,使用最大的K個(數(shù)量自定)特征值對應(yīng)的特征向量作為基逻谦,使用矩陣乘法直接求出數(shù)據(jù)集變換后的結(jié)果。
參考鏈接
PCA csdn
PCA zhihu
劉建平大佬:SVD 順便吹一波這位陪蜻,資料很全推導很詳細

作用

PCA和類似的降維算法有很大作用

  1. 數(shù)據(jù)降維:對高維數(shù)據(jù)進行降維邦马,減輕機器學習的計算量。
  2. 數(shù)據(jù)可視化:高維的數(shù)據(jù)不利于人類的觀察宴卖,故常常降維到二維或者三維
  3. 圖像壓縮:將一些眼睛難以察覺的細節(jié)去除滋将,常見圖像使用PCA的壓縮率能夠達到50%以上,而不損失大量細節(jié)症昏。
  4. 數(shù)據(jù)降噪随闽,包括圖像降噪:噪聲數(shù)據(jù)的方差一般比較小,而信號數(shù)據(jù)的方差一般比較大肝谭,所以PCA能夠去除噪聲掘宪。

python實現(xiàn)

由于PCA算法不依賴于數(shù)據(jù)集,無需進行訓練等分苇,故封裝為一個函數(shù)添诉。

#pca.py
import numpy as np

def pca(X:np.ndarray, K:int, debug:bool=False)->np.ndarray:
    if np.shape(X)[1] <= K:
        print("[-] dim too low");return
    if K <= 0:
        print("[-] K not valid");return
    # centering the data
    X_avg = np.average(X, axis=0)
    X_centered = X - X_avg
    # covariance matrix
    cov_mat = X_centered @ X_centered.T
    eigval, eigvec = np.linalg.eig(cov_mat)
    eigval_target = eigval[0:K]
    eigvec_target = eigvec[:, 0:K]
    if debug : print(eigval, eigvec)
    if debug : print(np.linalg.norm(np.abs(eigvec_target), axis=0))
    # print(np.linalg.norm(eigvec/np.linalg.norm(eigvec, ord=2, axis=1), ord=2, axis=1))
    # print(eigval_target, eigvec_target)
    return np.array(cov_mat @ eigvec_target, dtype=np.float64)

測試上述代碼,使用三維特征的數(shù)據(jù)集進行測試医寿。

#main.py

import pca
import numpy as np

X = np.array(
[
    [0., 0., 2.],
    [1., 1., 3.],
    [2., 2., 5.],
    [-1., 0., 5.],
    [4., 3., 2.]
])

print(pca.pca(X, 2))

測試結(jié)果如下所示

ComplexWarning: Casting complex values to real discards the imaginary part
  return np.array(cov_mat @ eigvec_target, dtype=np.float64)
[[  5.45643859   5.30087165] 
 [  0.66197922   1.3243035 ] 
 [ -2.64791688  -5.29721401] 
 [ 13.72678804  -2.15574602] 
 [-17.19728897   0.82778488]]

可以看到對數(shù)據(jù)實現(xiàn)了降維

相關(guān)算法的應(yīng)用

對圖片進行壓縮栏赴,原理見劉建平文
其中應(yīng)用了SVD(奇異值分解),SVD也可以用于PCA降維

#svd.py
def image_compress_pca_svd(X:np.ndarray, K:int, debug:bool=False)->np.ndarray:
    if len(np.shape(X)) != 2 : print("just support 2d data");return
    u, sigma, vh = np.linalg.svd(X)
    if debug:print(np.shape(sigma), "sigma shape")
    if debug:print(np.shape(u), np.shape(sigma), np.shape(vh))
    
    u[:, K:] = 0
    vh[K:, :] = 0

    s = np.zeros(np.shape(X), X.dtype)
    for i in range(K):
        s[i, i] = sigma[i]

    return u @ s @ vh

利用圖片進行測試
分別對三個通道進行壓縮靖秩,之后進行還原须眷,查看效果

#compress.py
import pca
import numpy as np
import matplotlib.pyplot as plt

img = plt.imread("what.jpg")

r = img[:, :, 0]
g = img[:, :, 1]
b = img[:, :, 2]

plt.imshow(img)
plt.show()

r1 = pca.image_compress_pca_svd(r, 400)
g1 = pca.image_compress_pca_svd(g, 400)
b1 = pca.image_compress_pca_svd(b, 400)

img1 = np.ndarray(np.shape(img), img.dtype)
img1[:, :, 0] = r1
img1[:, :, 1] = g1
img1[:, :, 2] = b1

# cv2.imshow("img1", img1)
plt.imshow(img1)
plt.show()

壓縮前后圖像


壓縮前

壓縮后

可以看出基本上還原了圖片的效果而沒有肉眼可見的損失

總結(jié)

  1. PCA降維算法是一種重要的數(shù)據(jù)處理方法
  2. SVD具有實際用途竖瘾,是一種樸素的壓縮方法,對于第二個維度的壓縮花颗,可以作為一種降維方法
  3. 實現(xiàn)起來也真方便:)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捕传,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扩劝,更是在濱河造成了極大的恐慌庸论,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棒呛,死亡現(xiàn)場離奇詭異聂示,居然都是意外死亡,警方通過查閱死者的電腦和手機簇秒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門鱼喉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趋观,你說我怎么就攤上這事扛禽。” “怎么了皱坛?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵编曼,是天一觀的道長。 經(jīng)常有香客問我麸恍,道長灵巧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任抹沪,我火速辦了婚禮,結(jié)果婚禮上瓤球,老公的妹妹穿的比我還像新娘融欧。我一直安慰自己,他們只是感情好卦羡,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布噪馏。 她就那樣靜靜地躺著,像睡著了一般绿饵。 火紅的嫁衣襯著肌膚如雪欠肾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天拟赊,我揣著相機與錄音刺桃,去河邊找鬼。 笑死吸祟,一個胖子當著我的面吹牛瑟慈,可吹牛的內(nèi)容都是我干的桃移。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼葛碧,長吁一口氣:“原來是場噩夢啊……” “哼借杰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起进泼,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蔗衡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乳绕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粘都,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年刷袍,在試婚紗的時候發(fā)現(xiàn)自己被綠了翩隧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡呻纹,死狀恐怖堆生,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雷酪,我是刑警寧澤淑仆,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站哥力,受9級特大地震影響蔗怠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吩跋,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一寞射、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锌钮,春花似錦桥温、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至氛谜,卻和暖如春掏觉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背值漫。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工澳腹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓遵湖,卻偏偏與公主長得像悔政,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子延旧,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

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