【机器学习实践】主成分分析及相关

主成分分析

原理

通俗地讲,主成分分析(PCA)的原理是数据集旋转(可以是高维)后,使前面的特征对应的值的方差尽量大,只取前面若干个特征达到降维的目的。
方法:求出数据集的散度矩阵,求出它的特征值和特征向量,使用最大的K个(数量自定)特征值对应的特征向量作为基,使用矩阵乘法直接求出数据集变换后的结果。
参考链接
PCA csdn
PCA zhihu
刘建平大佬:SVD 顺便吹一波这位,资料很全推导很详细

作用

PCA和类似的降维算法有很大作用

  1. 数据降维:对高维数据进行降维,减轻机器学习的计算量。
  2. 数据可视化:高维的数据不利于人类的观察,故常常降维到二维或者三维
  3. 图像压缩:将一些眼睛难以察觉的细节去除,常见图像使用PCA的压缩率能够达到50%以上,而不损失大量细节。
  4. 数据降噪,包括图像降噪:噪声数据的方差一般比较小,而信号数据的方差一般比较大,所以PCA能够去除噪声。

python实现

由于PCA算法不依赖于数据集,无需进行训练等,故封装为一个函数。

#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)

测试上述代码,使用三维特征的数据集进行测试。

#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))

测试结果如下所示

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]]

可以看到对数据实现了降维

相关算法的应用

对图片进行压缩,原理见刘建平文
其中应用了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()

压缩前后图像


压缩前

压缩后

可以看出基本上还原了图片的效果而没有肉眼可见的损失

总结

  1. PCA降维算法是一种重要的数据处理方法
  2. SVD具有实际用途,是一种朴素的压缩方法,对于第二个维度的压缩,可以作为一种降维方法
  3. 实现起来也真方便:)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容