PCA 機器學(xué)習(xí)實戰(zhàn)Demo

PCA算法框架

  1. 找到數(shù)據(jù)方差最大的投影方向;
  2. 利用數(shù)據(jù)協(xié)方差矩陣的特征值向量矩陣作為基,定義了新空間。
輸入:訓(xùn)練數(shù)據(jù)集X
輸出:以新的基表示的特征Y

1). 數(shù)據(jù)清洗,并規(guī)范化訓(xùn)練數(shù)據(jù),使變量中心為0,方差為1;(減均值,除方差)
2). 求數(shù)據(jù)的協(xié)方差矩陣∑:∑=XTX;(T代表X的轉(zhuǎn)置)
3). 求協(xié)方差矩陣的特征值λ:det(X-λI)=0;
4). 求協(xié)方差矩陣特征向量v:∑v = λv;(求出的特征向量要進行標準化處理)
5). 創(chuàng)建協(xié)方差矩陣∑的特征向量矩陣:E=[v1, v2, ..., vn]
6). 求變換后的矩陣Y:Y = XE

編碼實現(xiàn)采用Numpy,numpy中的cov函數(shù)已經(jīng)實現(xiàn)了中心化的步驟,并且numpy采用無偏估計,如下代碼所示,cov_mat1與cov_mat2是相等的

matrix = np.mat([[4, 4, 0, 2, 2],
                 [4, 0, 0, 3, 3],
                 [4, 0, 0, 1, 1],
                 [1, 1, 1, 2, 0],
                 [2, 2, 2, 0, 0],
                 [1, 1, 1, 0, 0],
                 [5, 5, 5, 0, 0]])
meaned_matrix = matrix - np.mean(matrix, axis=0)
cov_mat1 = np.cov(matrix, rowvar=False)
cov_mat2 = meaned_matrix.T * meaned_matrix / (meaned_matrix.shape[0] - 1)

利用numpy進行PCA,只需要進行4步:

# 1. 計算協(xié)方差矩陣
cov_matrix = np.cov(matrix, rower=False)
# 2. 計算特征值及特征向量
eig_vals, eig_vects = np.linalg.eig(cov_matrix) 
# 3. 生成主成分的特征向量矩陣
eig_val_index = np.argsort(eig_vals)[:-(dimension + 1):-1]
eig_vectors_mat = eig_vects[:, eig_val_index]
# 4. 求壓縮后的矩陣
transformed_mat = mean_removed * eig_vectors_mat
# 5. 重建降維后的矩陣
reconstructed_mat = (transformed_mat * eig_vectors_mat.T) + mean_vals

問題概述

半導(dǎo)體是在一些極為先進的工廠中制造出來的。設(shè)備的生命早期有限,并且花費極其巨大。
雖然通過早期測試和頻繁測試來發(fā)現(xiàn)有瑕疵的產(chǎn)品,但仍有一些存在瑕疵的產(chǎn)品通過測試。
如果我們通過機器學(xué)習(xí)技術(shù)用于發(fā)現(xiàn)瑕疵產(chǎn)品,那么它就會為制造商節(jié)省大量的資金。

具體來講,它擁有590個特征。我們看看能否對這些特征進行降維處理。

對于數(shù)據(jù)的缺失值的問題,我們有一些處理方法(參考第5章)
目前該章節(jié)處理的方案是:將缺失值NaN(Not a Number縮寫),全部用平均值來替代(如果用0來處理的策略就太差勁了)。

一. 首先分析數(shù)據(jù),獲取主成分方向的數(shù)目

def analyse_data(data_mat, threshold=0.9):
    # 返回結(jié)果
    pri_dir_num = -1

    # 協(xié)方差矩陣
    cov_mat = np.cov(data_mat, rowvar=False)
    # 求特征值和特征向量
    eig_vals, eig_vects = np.linalg.eig(cov_mat)
    # 將特征值從大到小排序,返回對應(yīng)的下標;特征值越大說明數(shù)據(jù)在對應(yīng)的特征向量方向方差越大,越重要
    eig_val_index = np.argsort(eig_vals)[:-(data_mat.shape[1] + 1):-1]

    '''
    特征值的重要性評估,如果選出的主方向的重要性比例達到threshold要求,
    則停止,并返回主方向數(shù)
    '''
    cov_all_score = np.float(sum(eig_vals))
    sum_cov_score = 0
    for i in range(0, len(eig_val_index)):
        line_cov_score = np.float(eig_vals[eig_val_index[i]])
        sum_cov_score += line_cov_score
        # 方差占比
        variance_ratio = line_cov_score / cov_all_score * 100
        # 累積方差占比,壓縮的精度
        cumulative_variance_ratio = sum_cov_score / cov_all_score * 100
        print('主成分:%s, 方差占比:%s%%, 累積方差占比:%s%%' % (format(i + 1, '2.0f'),
                                                  format(variance_ratio, '5.2f'),
                                                  format(cumulative_variance_ratio, '4.1f')))
        # 如果滿足精度要求則返回主方向數(shù)目
        if cumulative_variance_ratio >= threshold * 100:
            pri_dir_num = i + 1
            break
    return pri_dir_num

二. 根據(jù)最佳的主成分列,壓縮數(shù)據(jù)

def pca(data_matrix, dimension=9999999):
    """
    PCA降維
    :param data_matrix:     原數(shù)據(jù)集矩陣
    :param dimension:       保留的特征維數(shù)
    :return:
        transformed_mat     降維后數(shù)據(jù)集
        reconstructed_mat   新的數(shù)據(jù)集空間
    """
    # 計算每一列的均值
    mean_vals = np.mean(data_matrix, axis=0)

    # 每個向量同時都減去 均值
    mean_removed = data_matrix - mean_vals

    # cov協(xié)方差=[(x1-x均值)*(y1-y均值)+(x2-x均值)*(y2-y均值)+...+(xn-x均值)*(yn-y均值)]/(n-1)
    # 協(xié)方差矩陣:(多維)度量各個維度偏離其均值的程度
    covariance_mat = np.cov(data_matrix, rowvar=False)

    # eig_vals為特征值, eig_vects為特征向量
    eig_vals, eig_vects = np.linalg.eig(covariance_mat)
    # 對特征值,進行從小到大的排序,返回從小到大的index下標
    # -1表示倒序,將特征值從大到小排序
    eig_val_index = np.argsort(eig_vals)[:-(dimension + 1):-1]

    # 創(chuàng)建特征向量矩陣,eig_vects從大到小排序
    eig_vectors_mat = eig_vects[:, eig_val_index]
    # 求變換后的矩陣
    transformed_mat = mean_removed * eig_vectors_mat
    # 重建數(shù)據(jù),由于特征向量矩陣滿足正交性,所以特征值矩陣的逆和轉(zhuǎn)置是相等的
    reconstructed_mat = (transformed_mat * eig_vectors_mat.T) + mean_vals

    return transformed_mat, reconstructed_mat

由于特征向量的矩陣是正交的,所以ET=E-1,ETE=E-1E=I。
因此,設(shè)R代表reconstructed_mat,MR代表mean_removed,E代表eig_vectors_mat,MV代表mean_vals:

R = MR * E * ET + MV = MR + MV (即原矩陣抽取主成分后的結(jié)果)

紅色為主成分

補充:

  1. 兩個對稱方陣A,B,滿足A = PTBP,P是正交矩陣:ET=E-1,那么A和B為正交相似
  2. 任何一個對稱矩陣A都可以正交相似于一個對角矩陣D,總存在一個正交矩陣P,使得A=PTDP
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容