1.前言
花了好幾天的時間去學習資料探勘裡面的主成分分析(principal component analysis , pca)。pca是一種常用的無監督學習方法,他作為一種資料降維的方法是很有效的。選擇的資料集很經常的都是高維資料,處理起來要麼就是處理時間太慢,要麼就是訓練出來的學習模型精度會很低。同時,這些高維資料裡面就有的資料是不相關的,這些特徵(維)是我們不需要的。那麼對於這種情況,降維是必須的。
2.主成分分析演算法
據《統計學習方法》一書的表達:「主成分分析是利用正交變換把由線性相關變數表示的觀測資料轉換為少數幾個由線性無關變數表示的資料,線性無關的變數稱為主成分。」按我的理解,就是將所有的高維資料點,通過投影對映的方法,將資料點轉換至乙個新的座標系,而這個座標系的維度是小於或等於原先的座標系維度的。同時,找到這個我們想要的座標系的標準就是,在新座標系中,投影後的資料對應的每個座標軸上的資料的方差和都是最大的,這樣我們儲存下來的資料就是最完整的。而為了找到這個座標軸,我們可以拆分子問題,先找第乙個座標軸,第二個…知道找到想要的結果。這裡的第一座標軸,就稱為是第一主成分,以此類推。
3.總體主成分的定義(a = (a1 , a2 , … , ak)t ,其中a1 , a2 , … 都是一組n維向量)t:
滿足以下三點:
一、每乙個向量a1都是單位向量
二、a矩陣中的每乙個向量a1 , a2 , …兩兩的協方差均為0,即他們之間互不相關
三、a1是x資料的所有線性變換中方差最大的,a2是與a1無關的x的所有線性變換中方差和最大的…
4.數學推導
一、針對某個均值為0的資料集x中,找到乙個相對於當前x方差最大的主成分,也就是乙個座標軸,座標軸的方向向量是w = (w1 , w2 , w3 ,…,wn)
得到方差函式f(x)
二、針對當前的方差函式,求出他的最大值,即方差最大化,用的是梯度上公升的方法進行尋找。對多元函式的極值,還是同樣的方法,求偏導。
四、不斷迴圈上述過程,直到得到自己預想數量的總體主成分
5.pca**
import numpy as np
class pca:
def __init__(self , n_components):
assert n_components >= 1 , "the number of n is not valid."
self.n_components = n_components
self.components_ = none
#對這個pca例項,傳入乙個待主成分分析的矩陣x,用pca來適應這個x,提取出他的k個主成分(k個方向向量)
#儲存再pca例項的components裡面,是個k*n維矩陣,k是主成分的個數,n是x的列數
def fit_(self , x1):
assert x1.shape[1] >= self.n_components , "it's not legal."
# 對資料進行demean操作,使得資料在各個特徵下的均值為0
def demean(x):
return x - np.mean(x , axis = 0)
# 求資料點投影到乙個方向向量後的方差,這個函式越大越可取
def f(x , w):
return ((np.sum(x.dot(w))) ** 2 ) / x.shape[0]
# 求方差的導數,用這個得到乙個對w向量每乙個項的導數,返回的也是乙個n維的向量
def df(x , w):
return (x.t.dot(x.dot(w))) * 2. / x.shape[0]
# 對w進行單位化
def direction(w):
return w / np.linalg.norm(w)
# 得到下乙個主成分的方法,就是將原先的資料點除去前乙個主成分方向上的數值,具體就是
# 針對某乙個點x(i),他在前乙個主成分w上的投影是xproject,然後緊接著就可以做差x(i) - x(i)project得到去除第一主成分的矩陣
def delete_pca(x , w):
x2 = np.empty(x.shape)
for i in range(0 , x.shape[0]):
x2[i] = x[i] - (x[i].dot(w)) * w
return x2
##梯度上公升法求出最佳的向量w,也就是最佳的引數
def get_next_pca(x , initial_w , eta = 0.01 , n_iter = 1e4 , epional = 1e-8):
w = direction(initial_w)
count = 0
while count < n_iter:
history_w = w
gradient = df(x , w)
w = w + eta * gradient
w = direction(w)
if(abs(f(x , history_w) - f(x , w)) < epional):
break
count += 1
return w
# 如果是想得到n個主成分,通過一次呼叫函式就想得出
def get_n_pca(x, n , eta = 0.01 , n_iter = 1e4 , epional = 1e-8):
x_pca = x.copy()
#注意這裡的w矩陣(裡面包括n個方向向量w,即前n個主成分)的矩陣大小,一共有n行(前n個主成分),並且有x.shape[1]行
total_w = np.empty((self.n_components , x.shape[1]))
for i in range(0 , n):
initial_w = np.random.random(x.shape[1])
w = get_next_pca(x_pca , initial_w)
for j in range(0 , len(w)):
total_w[i,j] = w[j]
x_pca = delete_pca(x_pca , w)
return total_w
x1 = demean(x1)
self.components_ = get_n_pca(x1 , self.n_components)
return self
#當pca已經fit之後,可以用此pca來轉化x得到將維後的矩陣x
def tranport(self , x):
print(self.components_)
return x.dot(self.components_.t)
6.scikit-learn封裝的pca類使用
主成分分析
主成分分析 pca 分析乙個隨機向量的中的主成分 主成分一般不是隨機向量中的某乙個分量,而是不同分量的線性組合,根據資訊理論的觀點,資訊的多少與方差有關,所以 主成分是方差最大的幾個成分 主成分分析的方法是求隨機向量的協方差矩陣 用樣本協方差矩陣代替 對於差異較大的資料,可採用相關矩陣代替協方差矩陣...
主成分分析
理論要點 1 主成分分析是一種無監督學習,因此不能用交叉驗證來檢驗誤差 2 在處理資料之前,要對資料做中心化處理 3 p太大的話,做特徵分解用svd 4 一共有min n 1,p 個主成分,因為中心化以後,rank要降一維 5 主成分的載荷向量就是協方差矩陣的特徵向量,對應特徵值最大的是第一主成分,...
主成分分析
1.概念 將一組可能存在相關性的隨機變數轉變成互不相關的隨機變數。這個概念裡有三個地方需要理解清楚。1 隨機變數的指代 在資料集中,每乙個樣本,即將資料集理解成乙個 的話,乙個樣本就是一行,則每一列就是乙個特徵,也就是乙個隨機變數,一列的所有取值就是隨機變數的所有可能取值 說的所有可能取值只針對訓練...