中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python怎么實現PCA降維算法

發布時間:2022-02-21 15:54:06 來源:億速云 閱讀:213 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Python怎么實現PCA降維算法”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Python怎么實現PCA降維算法”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

一、算法概述

  • 主成分分析 (Principal ComponentAnalysis,PCA)是一種掌握事物主要矛盾的統計分析方法,它可以從多元事物中解析出主要影響因素,揭示事物的本質,簡化復雜的問題。

  • PCA 是最常用的一種降維方法,它的目標是通過某種線性投影,將高維的數據映射到低維的空間中,并期望在所投影的維度上數據的方差最大,以此使用較少的維度,同時保留較多原數據的維度。

  • PCA 算法目標是求出樣本數據協方差矩陣的特征值和特征向量,而協方差矩陣的特征向量的方向就是PCA需要投影的方向。使樣本數據向低維投影后,能盡可能表征原始的數據。

  • PCA 可以把具有相關性的高維變量合成為線性無關的低維變量,稱為主成分。主成分能夠盡可能的保留原始數據的信息。

  • PCA 通常用于高維數據集的探索與可視化,還可以用作數據壓縮和預處理等。

二、算法步驟

1.將原始數據按行組成m行n列的矩陣X

2.將X的每一列(代表一個屬性字段)進行零均值化,即減去這一列的均值

3.求出協方差矩陣

4.求出協方差矩陣的特征值及對應的特征向量r

5.將特征向量按對應特征值大小從左到右按列排列成矩陣,取前k列組成矩陣P

6.計算降維到k維的數據

三、相關概念

  • 方差:描述一個數據的離散程度

  • 協方差:描述兩個數據的相關性,接近1就是正相關,接近-1就是負相關,接近0就是不相關

  • 協方差矩陣:協方差矩陣是一個對稱的矩陣,而且對角線是各個維度的方差

  • 特征值:用于選取降維的K個特征值

  • 特征向量:用于選取降維的K個特征向量

四、算法優缺點

優點

  • 僅僅需要以方差衡量信息量,不受數據集以外的因素影響。

  • 各主成分之間正交,可消除原始數據成分間的相互影響的因素。

  • 計算方法簡單,主要運算是特征值分解,易于實現。

缺點

  • 主成分各個特征維度的含義具有一定的模糊性,不如原始樣本特征的解釋性強。

  • 方差小的非主成分也可能含有對樣本差異的重要信息,降維丟棄的數據可能對后續數據處理有影響。

五、算法實現

自定義實現

import numpy as np


# 對初始數據進行零均值化處理
def zeroMean(dataMat):
    # 求列均值
    meanVal = np.mean(dataMat, axis=0)
    # 求列差值
    newData = dataMat - meanVal
    return newData, meanVal


# 對初始數據進行降維處理
def pca(dataMat, percent=0.19):
    newData, meanVal = zeroMean(dataMat)

    # 求協方差矩陣
    covMat = np.cov(newData, rowvar=0)

    # 求特征值和特征向量
    eigVals, eigVects = np.linalg.eig(np.mat(covMat))

    # 抽取前n個特征向量
    n = percentage2n(eigVals, percent)
    print("數據降低到:" + str(n) + '維')

    # 將特征值按從小到大排序
    eigValIndice = np.argsort(eigVals)
    # 取最大的n個特征值的下標
    n_eigValIndice = eigValIndice[-1:-(n + 1):-1]
    # 取最大的n個特征值的特征向量
    n_eigVect = eigVects[:, n_eigValIndice]

    # 取得降低到n維的數據
    lowDataMat = newData * n_eigVect
    reconMat = (lowDataMat * n_eigVect.T) + meanVal

    return reconMat, lowDataMat, n


# 通過方差百分比確定抽取的特征向量的個數
def percentage2n(eigVals, percentage):
    # 按降序排序
    sortArray = np.sort(eigVals)[-1::-1]
    # 求和
    arraySum = sum(sortArray)

    tempSum = 0
    num = 0
    for i in sortArray:
        tempSum += i
        num += 1
        if tempSum >= arraySum * percentage:
            return num


if __name__ == '__main__':
    # 初始化原始數據(行代表樣本,列代表維度)
    data = np.random.randint(1, 20, size=(6, 8))
    print(data)

    # 對數據降維處理
    fin = pca(data, 0.9)
    mat = fin[1]
    print(mat)

利用Sklearn庫實現

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

# 加載數據
data = load_iris()
x = data.data
y = data.target

# 設置數據集要降低的維度
pca = PCA(n_components=2)
# 進行數據降維
reduced_x = pca.fit_transform(x)

red_x, red_y = [], []
green_x, green_y = [], []
blue_x, blue_y = [], []

# 對數據集進行分類
for i in range(len(reduced_x)):
    if y[i] == 0:
        red_x.append(reduced_x[i][0])
        red_y.append(reduced_x[i][1])
    elif y[i] == 1:
        green_x.append(reduced_x[i][0])
        green_y.append(reduced_x[i][1])
    else:
        blue_x.append(reduced_x[i][0])
        blue_y.append(reduced_x[i][1])

plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(green_x, green_y, c='g', marker='D')
plt.scatter(blue_x, blue_y, c='b', marker='.')
plt.show()

六、算法優化

PCA是一種線性特征提取算法,通過計算將一組特征按重要性從小到大重新排列得到一組互不相關的新特征,但該算法在構造子集的過程中采用等權重的方式,忽略了不同屬性對分類的貢獻是不同的。

  • KPCA算法

KPCA是一種改進的PCA非線性降維算法,它利用核函數的思想,把樣本數據進行非線性變換,然后在變換空間進行PCA,這樣就實現了非線性PCA。

  • 局部PCA算法

局部PCA是一種改進的PCA局部降維算法,它在尋找主成分時加入一項具有局部光滑性的正則項,從而使主成分保留更多的局部性信息。

讀到這里,這篇“Python怎么實現PCA降維算法”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南投市| 临邑县| 固阳县| 柘荣县| 太康县| 新沂市| 山西省| 马龙县| 饶平县| 耒阳市| 岫岩| 勐海县| 河北省| 手游| 安顺市| 宜丰县| 稻城县| 交口县| 驻马店市| 襄垣县| 泰顺县| 普定县| 康保县| 顺平县| 河西区| 万全县| 崇礼县| 双江| 晋中市| 苏尼特右旗| 尤溪县| 岳西县| 鹤岗市| 乌鲁木齐市| 高淳县| 辽阳市| 察隅县| 高平市| 英吉沙县| 开阳县| 嘉荫县|