在我們數(shù)據(jù)挖掘的任務(wù)中,數(shù)據(jù)往往擁有非常多的緯度。這些過(guò)多的維度泵三,往往給數(shù)據(jù)挖掘的任務(wù)帶來(lái)困難。本小節(jié)以PCA算法為例來(lái)講解降維的主要算法思想和算法流程。降維算法不僅可以為計(jì)算機(jī)減少大量的數(shù)據(jù)運(yùn)算烫幕,簡(jiǎn)化數(shù)據(jù)俺抽,也可以去除噪聲,使數(shù)據(jù)集更易使用较曼。PCA為最常用的降維算法之一磷斧。廣泛應(yīng)用于數(shù)據(jù)壓縮,圖像壓縮捷犹,信息壓縮等領(lǐng)域弛饭。
PCA全稱Principal Component Analysis,即主成分分析萍歉,它可以通過(guò)線性變換將原始數(shù)據(jù)變換為一組各維度線性無(wú)關(guān)的基來(lái)表示孩哑,以此來(lái)提取數(shù)據(jù)的主要線性分量。
對(duì)于非技術(shù)同學(xué)可能看到PCA的定義會(huì)一臉懵逼翠桦。我們還是用通俗的話解釋下:
也就是說(shuō)横蜒,我們要找出一組正交基,使原數(shù)據(jù)變換到這組正交基后销凑,數(shù)據(jù)屬性方差最大丛晌。就這么簡(jiǎn)單。
這里說(shuō)明下為什么需要方差最大斗幼。方差越大澎蛛,說(shuō)明數(shù)據(jù)越分散。通常認(rèn)為蜕窿,數(shù)據(jù)的某個(gè)特征維度上數(shù)據(jù)越分散谋逻,該特征信息量越大,熵越大桐经。(數(shù)據(jù)的無(wú)序也在一定程度上反應(yīng)了數(shù)據(jù)的主要成分)毁兆。我們都知道矩陣的乘法,實(shí)際就是用左邊的矩陣對(duì)右邊的向量做線性變換阴挣。其實(shí)也就是對(duì)原矩陣的基做旋轉(zhuǎn)和拉伸變換气堕。那么,我們只要找到這個(gè)變換矩陣畔咧,然后用變換矩陣乘以原數(shù)據(jù)茎芭,則乘的結(jié)果就是我們降維后的數(shù)據(jù)了。這里的分母應(yīng)為m-1.
這里首先說(shuō)明下方差的定義:
由于實(shí)際的計(jì)算過(guò)程中誓沸,我們通常會(huì)對(duì)數(shù)據(jù)做歸一化操作梅桩,因此方差可以直接表示為:
同理的數(shù)據(jù)歸一化后,協(xié)方差的定義為:
這里我們舉一個(gè)實(shí)例:
假設(shè)我們有一組個(gè)二維的數(shù)據(jù)拜隧,
則該組二維數(shù)據(jù)對(duì)應(yīng)的協(xié)方差矩陣為:
我們知道宿百,最終我們要找的是使方差最大的線性變換對(duì)應(yīng)的一組正交基煮寡。通過(guò)協(xié)方差矩陣可以看出。要使這個(gè)這組基互相正交犀呼,則協(xié)方差矩陣的協(xié)方差項(xiàng)需要全為0幸撕,即對(duì)協(xié)方差矩陣進(jìn)行對(duì)角化操作。
這里也可以采用知乎上的一個(gè)證明思路:
最終推出外臂,求正交基的過(guò)程坐儿,即是原矩陣協(xié)方差矩陣對(duì)角化的過(guò)程。
由于協(xié)方差矩陣是一個(gè)標(biāo)準(zhǔn)的對(duì)稱矩陣宋光,根據(jù)對(duì)陣矩陣的定理:
其中罪佳,拉姆達(dá)為A矩陣的特征向量所對(duì)應(yīng)的特征值逛漫。
也就說(shuō),我們只要求出協(xié)方差矩陣對(duì)應(yīng)的特征值和特征向量赘艳。就可以把協(xié)方差矩陣對(duì)角化酌毡,得到對(duì)應(yīng)的對(duì)角化矩陣。
1.而這個(gè)對(duì)角化矩陣的協(xié)方差項(xiàng)都為0蕾管,即滿足了正交基枷踏。
2.我們對(duì)特征值排序,降維時(shí)掰曾,保留大的特征值旭蠕。即滿足了最大方差。
假設(shè)我們此時(shí)降維為k旷坦,則保留前k個(gè)特征向量(歸一化)掏熬,則這前K個(gè)特征向量對(duì)應(yīng)的線性變換,即為PCA降維對(duì)應(yīng)的線性變換矩陣秒梅。 至此旗芬,PCA算法的整個(gè)算法過(guò)程結(jié)束。
我們?cè)诖丝偨Y(jié)一下這個(gè)看似復(fù)雜的過(guò)程:以降維到K個(gè)維度為例
1.將原始數(shù)據(jù)的每個(gè)屬性做均值歸一化番电。
2.求出原矩陣對(duì)應(yīng)的協(xié)方差矩陣岗屏。
3.求出協(xié)方差矩陣對(duì)應(yīng)的特征值和特征向量。
4.將特征向量歸一化后按對(duì)特征值大小從上到下按行排列成矩陣漱办,取前k行組成矩陣P。
5.矩陣P對(duì)數(shù)據(jù)做線性變換的結(jié)果婉烟,即為降維后的數(shù)據(jù)娩井。
關(guān)于矩陣特征向量的求解,請(qǐng)參考線性代數(shù)教材似袁。
非技術(shù)的同學(xué)讀到這里應(yīng)該有所理解洞辣。如果實(shí)在有疑問(wèn)可以記住上面pca運(yùn)算的過(guò)程咐刨,或者評(píng)論提問(wèn)。
按照慣例扬霜,接下來(lái)我會(huì)用代碼來(lái)演示下pca的簡(jiǎn)單使用定鸟。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.decomposition import PCA
from sklearn.datasets.samples_generator import make_blobs
# X為樣本特征,Y為樣本簇類別著瓶, 共1000個(gè)樣本联予,每個(gè)樣本3個(gè)特征,共4個(gè)簇
X, y = make_blobs(n_samples=10000, n_features=3, centers=[[3,3, 3], [0,0,0], [1,1,1], [2,2,2]], cluster_std=[0.2, 0.1, 0.2, 0.2],
random_state =9)
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
plt.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o')
plt.show()
pca = PCA(n_components=2)
pca.fit(X)
print(pca.explained_variance_ratio_)
print(pca.explained_variance_)
# pca = PCA(n_components=0.95)
# pca.fit(X)
X_new = pca.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o')
plt.show()
這里我截出代碼運(yùn)行的截圖材原,這里以2維為例:
降維前:
降維后:
pca算法的核心思想介紹就到這里沸久。如果問(wèn)題歡迎評(píng)論與我討論。