最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python PCA降維的兩種實(shí)現(xiàn)方法

 更新時(shí)間:2022年01月14日 09:19:39   作者:F riend L Y  
大家好,本篇文章主要講的是Python PCA降維的兩種實(shí)現(xiàn)方法,感興趣的的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下

前言

        PCA降維,一般是用于數(shù)據(jù)分析和機(jī)器學(xué)習(xí)。它的作用是把一個(gè)高維的數(shù)據(jù)在保留最大信息量的前提下降低到一個(gè)低維的空間,從而使我們能夠提取數(shù)據(jù)的主要特征分量,從而得到對數(shù)據(jù)影響最大的主成分,便于我們對數(shù)據(jù)進(jìn)行分析等后續(xù)操作。

        例如,在機(jī)器學(xué)習(xí)中,當(dāng)你想跟據(jù)一個(gè)數(shù)據(jù)集來進(jìn)行預(yù)測工作時(shí),往往要采用特征構(gòu)建、不同特征相乘、相加等操作,來擴(kuò)建特征,所以,當(dāng)數(shù)據(jù)處理完畢后,每個(gè)樣本往往會(huì)有很多個(gè)特征,但是,如果把所有數(shù)據(jù)全部喂入模型,可能會(huì)導(dǎo)致糟糕的結(jié)果。在高維數(shù)據(jù)集中,往往只有部分特征有良好的預(yù)測能力,很多特征純粹是噪音(沒有預(yù)測能力),很多特征彼此之間也可能高度相關(guān),這些因素會(huì)降低模型的預(yù)測精度,訓(xùn)練模型的時(shí)間也更長。降低數(shù)據(jù)集的維度在某種程度上能解決這些問題,這時(shí)候就用到了PCA降維。

        假設(shè)原始數(shù)據(jù)集的特征有500個(gè),通過PCA降維,降到了400,那么我們就可以用降維后得到的這400個(gè)特征代替原始數(shù)據(jù)集的那500個(gè),此時(shí)再喂給模型,那么模型的預(yù)測能力相比之前會(huì)有所提升。但要明白一點(diǎn)的是,降維后得到的這400個(gè)特征是新的特征,是原始數(shù)據(jù)集在高維空間某一平面上的投影,能夠反映原特征提供的大部分信息,并不是指在原來的500個(gè)中篩選400個(gè)特征。

PCA降維的一般步驟為:

1.將原始數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化(一般是去均值,如果特征在不同的數(shù)量級(jí)上,則還要將其除以標(biāo)準(zhǔn)差)

2.計(jì)算標(biāo)準(zhǔn)化數(shù)據(jù)集的協(xié)方差矩陣

3.計(jì)算協(xié)方差矩陣的特征值和特征向量

4.保留最重要(特征值最大)的前k個(gè)特征(k就表示降維后的維度)

5.找到這k個(gè)特征值對應(yīng)的特征向量

6.將標(biāo)準(zhǔn)化數(shù)據(jù)集乘以該k個(gè)特征向量,得到降維后的結(jié)果

實(shí)現(xiàn)PCA降維,一般有兩種方法:

首先先來解釋一下代碼中用到的數(shù)據(jù)集:

        在這兩個(gè)代碼中,用的是sklean庫中自帶的iris(鳶尾花)數(shù)據(jù)集。iris數(shù)據(jù)集包含150個(gè)樣本,每個(gè)樣本包含四個(gè)屬性特征(花萼長度、花萼寬度、花瓣長度、花瓣寬度)和一個(gè)類別標(biāo)簽(分別用0、1、2表示山鳶尾、變色鳶尾和維吉尼亞鳶尾)。

data = load_iris()
y = data.target
x = data.data

y就表示數(shù)據(jù)集中的類別標(biāo)簽,x表示數(shù)據(jù)集中的屬性數(shù)據(jù)。因?yàn)轼S尾花類別分為三類,所以我們降維后,要跟據(jù)y的值,分別對這三類數(shù)據(jù)點(diǎn)進(jìn)行繪圖。

第一種,就是依照上面PCA的步驟,通過矩陣運(yùn)算,最終得到降維后的結(jié)果

import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
 
 
def pca(dataMat, topNfeat):
    meanVals = np.mean(dataMat, axis=0)
    meanRemoved = dataMat - meanVals  # 標(biāo)準(zhǔn)化(去均值)
    covMat = np.cov(meanRemoved, rowvar=False)
    eigVals, eigVets = np.linalg.eig(np.mat(covMat))  # 計(jì)算矩陣的特征值和特征向量
    eigValInd = np.argsort(eigVals)  # 將特征值從小到大排序,返回的是特征值對應(yīng)的數(shù)組里的下標(biāo)
    eigValInd = eigValInd[:-(topNfeat + 1):-1]  # 保留最大的前K個(gè)特征值
    redEigVects = eigVets[:, eigValInd]  # 對應(yīng)的特征向量
    lowDDatMat = meanRemoved * redEigVects  # 將數(shù)據(jù)轉(zhuǎn)換到低維新空間
    # reconMat = (lowDDatMat * redEigVects.T) + meanVals  # 還原原始數(shù)據(jù)
    return lowDDatMat
 
 
def plotPCA(lowMat):
    reconArr = np.array(lowMat)
    red_x, red_y = [], []
    blue_x, blue_y = [], []
    green_x, green_y = [], []
    for i in range(len(reconArr)):
        if y[i] == 0:
            red_x.append(reconArr[i][0])
            red_y.append(reconArr[i][1])
        elif y[i] == 1:
            blue_x.append(reconArr[i][0])
            blue_y.append(reconArr[i][1])
        else:
            green_x.append(reconArr[i][0])
            green_y.append(reconArr[i][1])
    plt.scatter(red_x, red_y, c='r', marker='x')
    plt.scatter(blue_x, blue_y, c='b', marker='D')
    plt.scatter(green_x, green_y, c='g', marker='.')
    plt.show()
 
 
if __name__ == '__main__':
    data = load_iris()
    y = data.target
    x = data.data
    matx = np.mat(x)
    lowDMat = pca(matx, 2)
    plotPCA(lowDMat)

第二種,是在sklearn庫中調(diào)用PCA算法來實(shí)現(xiàn):

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA  # 加載PCA算法包
from sklearn.datasets import load_iris
import numpy as np
 
data = load_iris()
y = data.target
x = data.data
pca = PCA(n_components=2)  # 加載PCA算法,設(shè)置降維后主成分?jǐn)?shù)目為2
reduced_x = pca.fit_transform(x)  # 對樣本進(jìn)行降維
# reduced_x = np.dot(reduced_x, pca.components_) + pca.mean_  # 還原數(shù)據(jù)
 
red_x, red_y = [], []
blue_x, blue_y = [], []
green_x, green_y = [], []
# print(reduced_x)
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:
        blue_x.append(reduced_x[i][0])
        blue_y.append(reduced_x[i][1])
    else:
        green_x.append(reduced_x[i][0])
        green_y.append(reduced_x[i][1])
plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(blue_x, blue_y, c='b', marker='D')
plt.scatter(green_x, green_y, c='g', marker='.')
plt.show()

        在第二個(gè)代碼中,值得一說的是fit_transform()這個(gè)函數(shù),它其實(shí)就是fit()和transform()這兩個(gè)函數(shù)的結(jié)合,相當(dāng)于先調(diào)用fit()再調(diào)用transform()。fit()和transform()這兩個(gè)函數(shù)在sklearn庫中經(jīng)常出現(xiàn),fit()函數(shù)可以理解為求傳入的數(shù)據(jù)集的一些固有的屬性(如方差、均值等等),相當(dāng)于一個(gè)訓(xùn)練過程,而transform()函數(shù),可以理解為對訓(xùn)練后的數(shù)據(jù)集進(jìn)行相應(yīng)的操作(如歸一化、降維等等)。在不同的模塊中,這兩個(gè)函數(shù)的具體實(shí)現(xiàn)也不一樣,比如在PCA模塊里,fit()相當(dāng)于去均值,transform()則相當(dāng)于降維。

這兩種代碼運(yùn)行后,生成的圖像如下(圖一為第一種代碼,圖二為第二種代碼):

圖一

圖二

        可以看到,第一種代碼畫出的圖像與第二種代碼畫出的圖像關(guān)于y=0這條直線對稱,雖然不清楚這是什么原因(后續(xù)有空的話我會(huì)去找找原因),但是這并不影響降維的結(jié)果。

降維前的數(shù)據(jù)(部分)                                                             

降維后的數(shù)據(jù)(部分)

        所以,此時(shí)我們使用降維后的二維數(shù)據(jù)集就可以用來表示降維前四維數(shù)據(jù)集的大部分信息。

        降維后得到的數(shù)據(jù)可以通過逆操作來進(jìn)行數(shù)據(jù)集的還原,具體原理就不過多解釋,具體操作代碼的話我已在代碼的注釋里面寫出,但是重建出來的數(shù)據(jù)會(huì)和原始數(shù)據(jù)有一定的誤差(如下圖)

        原因的話你可以這樣理解:我們的原始數(shù)據(jù)為四維空間,現(xiàn)在用PCA降維到二維空間,則保留數(shù)據(jù)投影方差最大的兩個(gè)軸向,因此舍棄掉了另外兩個(gè)相對不重要的特征軸,從而造成了一定的信息丟失,所以會(huì)產(chǎn)生重構(gòu)誤差。

總結(jié)

到此這篇關(guān)于Python PCA降維的兩種實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Python PCA降維內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解Django的中間件middleware

    深入理解Django的中間件middleware

    這篇文章主要給大家介紹了關(guān)于Django中的中間件middleware的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Python中的OpenCV圖像腐蝕處理和膨脹處理

    Python中的OpenCV圖像腐蝕處理和膨脹處理

    這篇文章主要介紹了Python中的OpenCV圖像腐蝕處理和膨脹處理,OpenCV是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺庫,可用于開發(fā)實(shí)時(shí)的圖像處理、計(jì)算機(jī)視覺以及模式識(shí)別程序,需要的朋友可以參考下
    2023-08-08
  • Python+Kepler.gl輕松制作酷炫路徑動(dòng)畫的實(shí)現(xiàn)示例

    Python+Kepler.gl輕松制作酷炫路徑動(dòng)畫的實(shí)現(xiàn)示例

    這篇文章主要介紹了Python+Kepler.gl輕松制作酷炫路徑動(dòng)畫的實(shí),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧現(xiàn)示例
    2020-06-06
  • pandas將DataFrame的列變成行索引的方法

    pandas將DataFrame的列變成行索引的方法

    下面小編就為大家分享一篇pandas將DataFrame的列變成行索引的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Pandas中的空字符串(非缺失值)處理方式

    Pandas中的空字符串(非缺失值)處理方式

    這篇文章主要介紹了Pandas中的空字符串(非缺失值)處理方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 10行Python代碼助你整理雜亂無章的文件

    10行Python代碼助你整理雜亂無章的文件

    這篇文章主要和大家分享一個(gè)簡單的小程序,只需要10行Python代碼,就能助你整理雜亂無章的文件,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-02-02
  • 深入了解Python中Lambda函數(shù)的用法

    深入了解Python中Lambda函數(shù)的用法

    lambda函數(shù)是Python中常用的內(nèi)置函數(shù),又稱為匿名函數(shù)。和普通函數(shù)相比,它只有函數(shù)體,省略了def和return,使得結(jié)構(gòu)看起來更精簡。本文將詳細(xì)說說Lambda函數(shù)的用法,需要的可以參考一下
    2022-09-09
  • python演示解答正則為什么是最強(qiáng)文本處理工具

    python演示解答正則為什么是最強(qiáng)文本處理工具

    正則表達(dá)式又稱規(guī)則表達(dá)式,通常被用來檢索、替換那些符合某個(gè)模式(規(guī)則)的文本,它是最強(qiáng)的文本處理工具,至于原因本文將給你答案
    2021-09-09
  • Python3 使用selenium插件爬取蘇寧商家聯(lián)系電話

    Python3 使用selenium插件爬取蘇寧商家聯(lián)系電話

    這篇文章主要介紹了Python3 selenium爬取蘇寧商家聯(lián)系電話,此處使用了selenium插件 使用的是火狐瀏覽器 信息存儲(chǔ)到csv表格里面,需要的朋友可以參考下
    2019-12-12
  • Python實(shí)現(xiàn)繪制置信區(qū)間

    Python實(shí)現(xiàn)繪制置信區(qū)間

    置信區(qū)間是從觀測數(shù)據(jù)的統(tǒng)計(jì)量計(jì)算的一種估計(jì)值,它給出了一個(gè)可能包含具有特定置信水平的總體參數(shù)的值范圍,下面我們就來看看如何使用Python繪制置信區(qū)間吧
    2024-02-02

最新評論

大足县| 桦甸市| 南澳县| 遵化市| 兰坪| 什邡市| 周宁县| 洛隆县| 抚宁县| 新邵县| 泾阳县| 徐州市| 横峰县| 寿宁县| 尉氏县| 景德镇市| 奇台县| 旅游| 鄂伦春自治旗| 定陶县| 东阿县| 安吉县| 增城市| 政和县| 互助| 邯郸市| 澜沧| 花莲市| 洛川县| 盐津县| 江源县| 万山特区| 合作市| 大邑县| 务川| 从化市| 江华| 安龙县| 阳城县| 宁海县| 吐鲁番市|