數(shù)據(jù)挖掘:特征選擇:主成分分析PCA教程_第1頁
數(shù)據(jù)挖掘:特征選擇:主成分分析PCA教程_第2頁
數(shù)據(jù)挖掘:特征選擇:主成分分析PCA教程_第3頁
數(shù)據(jù)挖掘:特征選擇:主成分分析PCA教程_第4頁
數(shù)據(jù)挖掘:特征選擇:主成分分析PCA教程_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

數(shù)據(jù)挖掘:特征選擇:主成分分析PCA教程1數(shù)據(jù)挖掘簡介1.1數(shù)據(jù)挖掘的基本概念數(shù)據(jù)挖掘(DataMining)是一種從大量數(shù)據(jù)中提取有用信息的過程,這些信息可以是模式、關(guān)聯(lián)、趨勢或異常。數(shù)據(jù)挖掘技術(shù)廣泛應(yīng)用于商業(yè)智能、科學(xué)研究、金融分析、醫(yī)療診斷等多個(gè)領(lǐng)域,幫助決策者從數(shù)據(jù)中發(fā)現(xiàn)隱藏的知識,從而做出更明智的決策。數(shù)據(jù)挖掘涉及多個(gè)步驟,包括數(shù)據(jù)清洗、數(shù)據(jù)集成、數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)挖掘、模式評估和知識表示。其中,數(shù)據(jù)清洗和數(shù)據(jù)集成用于處理數(shù)據(jù)的不一致性和缺失值,數(shù)據(jù)轉(zhuǎn)換則通過編碼、規(guī)范化或特征選擇等方法將數(shù)據(jù)轉(zhuǎn)換為適合挖掘的形式。1.2特征選擇的重要性在數(shù)據(jù)挖掘過程中,特征選擇(FeatureSelection)是一個(gè)關(guān)鍵步驟,它涉及從原始數(shù)據(jù)集中選擇最相關(guān)的特征子集,以提高模型的性能和解釋性。特征選擇的重要性主要體現(xiàn)在以下幾個(gè)方面:減少維度:高維數(shù)據(jù)不僅增加了計(jì)算的復(fù)雜性,還可能導(dǎo)致模型過擬合。通過特征選擇,可以減少數(shù)據(jù)的維度,從而簡化模型并提高其泛化能力。提高模型性能:無關(guān)或冗余的特征可能會干擾模型的學(xué)習(xí)過程,導(dǎo)致性能下降。特征選擇有助于去除這些特征,使模型更加專注于重要的信息。增強(qiáng)模型解釋性:在許多應(yīng)用中,模型的解釋性是非常重要的。特征選擇可以減少模型的復(fù)雜性,使其更容易理解和解釋。節(jié)省資源:在數(shù)據(jù)采集和存儲方面,特征選擇可以減少所需的數(shù)據(jù)量,從而節(jié)省存儲空間和計(jì)算資源。1.3示例:使用Python進(jìn)行特征選擇假設(shè)我們有一個(gè)包含多個(gè)特征的數(shù)據(jù)集,我們想要使用主成分分析(PCA)進(jìn)行特征選擇。以下是一個(gè)使用Python和scikit-learn庫進(jìn)行PCA特征選擇的示例:importnumpyasnp

importpandasaspd

fromsklearn.decompositionimportPCA

fromsklearn.preprocessingimportStandardScaler

#創(chuàng)建一個(gè)示例數(shù)據(jù)集

data={

'Feature1':[1,2,3,4,5],

'Feature2':[5,4,3,2,1],

'Feature3':[1,1,1,1,1],

'Feature4':[2,4,6,8,10],

'Feature5':[10,8,6,4,2]

}

df=pd.DataFrame(data)

#數(shù)據(jù)預(yù)處理:標(biāo)準(zhǔn)化

scaler=StandardScaler()

df_scaled=scaler.fit_transform(df)

#應(yīng)用PCA

pca=PCA(n_components=2)#選擇前兩個(gè)主成分

principalComponents=pca.fit_transform(df_scaled)

#創(chuàng)建主成分DataFrame

principalDf=pd.DataFrame(data=principalComponents,columns=['principalcomponent1','principalcomponent2'])

#輸出主成分DataFrame

print(principalDf)1.3.1代碼解釋數(shù)據(jù)集創(chuàng)建:我們首先創(chuàng)建一個(gè)包含5個(gè)特征的示例數(shù)據(jù)集。數(shù)據(jù)預(yù)處理:PCA對數(shù)據(jù)的尺度敏感,因此我們使用StandardScaler對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理,確保每個(gè)特征具有相同的尺度。PCA應(yīng)用:我們實(shí)例化PCA類,并設(shè)置n_components=2,這意味著我們想要保留前兩個(gè)主成分。然后,我們使用fit_transform方法對標(biāo)準(zhǔn)化后的數(shù)據(jù)進(jìn)行PCA轉(zhuǎn)換。結(jié)果輸出:最后,我們創(chuàng)建一個(gè)新的DataFrame來存儲PCA轉(zhuǎn)換后的結(jié)果,并輸出這個(gè)DataFrame。通過這個(gè)過程,我們能夠?qū)⒃嫉?維數(shù)據(jù)集減少到2維,同時(shí)保留了數(shù)據(jù)中的大部分信息。這不僅簡化了數(shù)據(jù),還可能提高后續(xù)模型的性能和解釋性。2主成分分析PCA原理2.1PCA的數(shù)學(xué)基礎(chǔ)主成分分析(PCA)是一種統(tǒng)計(jì)方法,用于識別數(shù)據(jù)集中的模式,通過減少數(shù)據(jù)的維度來簡化數(shù)據(jù)集,同時(shí)盡可能保留數(shù)據(jù)的方差。PCA的核心是將數(shù)據(jù)轉(zhuǎn)換到一個(gè)新的坐標(biāo)系統(tǒng)中,這個(gè)坐標(biāo)系統(tǒng)的第一軸(即第一主成分)是原始數(shù)據(jù)中方差最大的方向,第二軸(第二主成分)是與第一軸正交且方差次大的方向,以此類推。2.1.1協(xié)方差矩陣與特征值分解PCA的第一步是計(jì)算數(shù)據(jù)的協(xié)方差矩陣。假設(shè)我們有一個(gè)數(shù)據(jù)集X,其中每一列代表一個(gè)特征,每一行代表一個(gè)樣本。協(xié)方差矩陣C定義為:C其中n是樣本數(shù)量。協(xié)方差矩陣反映了特征之間的線性關(guān)系。接下來,我們對協(xié)方差矩陣進(jìn)行特征值分解,得到特征值λ1,λ2,2.1.2降維在得到特征值和特征向量后,我們選擇最大的k個(gè)特征值對應(yīng)的特征向量,構(gòu)建一個(gè)k×p的矩陣V。這個(gè)矩陣將用于將原始數(shù)據(jù)投影到假設(shè)我們選擇前兩個(gè)特征值對應(yīng)的特征向量,那么我們可以使用以下Python代碼進(jìn)行降維:importnumpyasnp

fromsklearn.decompositionimportPCA

#假設(shè)X是我們原始的數(shù)據(jù)集,每一列是一個(gè)特征,每一行是一個(gè)樣本

X=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])

#創(chuàng)建PCA對象,指定降維后的維度為2

pca=PCA(n_components=2)

#對數(shù)據(jù)進(jìn)行降維

X_pca=pca.fit_transform(X)

#輸出降維后的數(shù)據(jù)

print(X_pca)2.1.3重構(gòu)數(shù)據(jù)PCA還可以用于數(shù)據(jù)重構(gòu),即從降維后的數(shù)據(jù)中恢復(fù)原始數(shù)據(jù)。這可以通過將降維后的數(shù)據(jù)乘以特征向量矩陣的轉(zhuǎn)置來實(shí)現(xiàn)。#從降維后的數(shù)據(jù)中重構(gòu)原始數(shù)據(jù)

X_reconstructed=pca.inverse_transform(X_pca)

#輸出重構(gòu)后的數(shù)據(jù)

print(X_reconstructed)2.2PCA的幾何解釋PCA的幾何解釋是尋找數(shù)據(jù)的主方向,即數(shù)據(jù)點(diǎn)分布最廣的方向。在二維空間中,PCA的第一主成分是數(shù)據(jù)點(diǎn)分布最廣的直線,第二主成分是與第一主成分正交且數(shù)據(jù)點(diǎn)分布次廣的直線。2.2.1數(shù)據(jù)點(diǎn)分布假設(shè)我們有一個(gè)二維數(shù)據(jù)集,數(shù)據(jù)點(diǎn)分布在一條直線上。如果我們使用PCA對這個(gè)數(shù)據(jù)集進(jìn)行降維,那么降維后的數(shù)據(jù)將只保留這條直線的信息,即數(shù)據(jù)點(diǎn)在直線上投影的坐標(biāo)。importmatplotlib.pyplotasplt

#假設(shè)X是我們原始的二維數(shù)據(jù)集

X=np.array([[1,2],[2,4],[3,6],[4,8]])

#創(chuàng)建PCA對象,指定降維后的維度為1

pca=PCA(n_components=1)

#對數(shù)據(jù)進(jìn)行降維

X_pca=pca.fit_transform(X)

#將降維后的數(shù)據(jù)投影回二維空間

X_projected=X_pca.dot(ponents_)

#繪制原始數(shù)據(jù)和降維后的數(shù)據(jù)

plt.scatter(X[:,0],X[:,1],alpha=0.2)

plt.scatter(X_projected[:,0],X_projected[:,1],alpha=0.8)

plt.axis('equal')

plt.show()2.2.2方差最大化PCA的目標(biāo)是找到數(shù)據(jù)的主方向,即數(shù)據(jù)點(diǎn)分布最廣的方向。在二維空間中,PCA的第一主成分是數(shù)據(jù)點(diǎn)分布最廣的直線,第二主成分是與第一主成分正交且數(shù)據(jù)點(diǎn)分布次廣的直線。#計(jì)算協(xié)方差矩陣

C=np.cov(X,rowvar=False)

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

eigenvalues,eigenvectors=np.linalg.eig(C)

#繪制數(shù)據(jù)點(diǎn)和特征向量

plt.scatter(X[:,0],X[:,1],alpha=0.2)

plt.quiver(0,0,eigenvectors[0,0]*eigenvalues[0],eigenvectors[1,0]*eigenvalues[0],color='r')

plt.quiver(0,0,eigenvectors[0,1]*eigenvalues[1],eigenvectors[1,1]*eigenvalues[1],color='b')

plt.axis('equal')

plt.show()通過以上代碼,我們可以看到,紅色的箭頭代表了第一主成分,即數(shù)據(jù)點(diǎn)分布最廣的方向,藍(lán)色的箭頭代表了第二主成分,即與第一主成分正交且數(shù)據(jù)點(diǎn)分布次廣的方向。3數(shù)據(jù)挖掘:特征選擇:主成分分析PCA3.1PCA的實(shí)施步驟3.1.1數(shù)據(jù)預(yù)處理數(shù)據(jù)預(yù)處理是PCA分析的第一步,主要包括數(shù)據(jù)清洗、缺失值處理、數(shù)據(jù)標(biāo)準(zhǔn)化等操作。數(shù)據(jù)標(biāo)準(zhǔn)化尤為重要,因?yàn)镻CA對數(shù)據(jù)的量綱敏感,不同量綱的特征可能會對結(jié)果產(chǎn)生偏斜。示例代碼importnumpyasnp

fromsklearn.preprocessingimportStandardScaler

#假設(shè)我們有以下數(shù)據(jù)

data=np.array([[1,2],[3,4],[5,6],[7,8]])

#使用StandardScaler進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化

scaler=StandardScaler()

data_scaled=scaler.fit_transform(data)

#打印標(biāo)準(zhǔn)化后的數(shù)據(jù)

print("標(biāo)準(zhǔn)化后的數(shù)據(jù):\n",data_scaled)3.1.2計(jì)算協(xié)方差矩陣協(xié)方差矩陣反映了數(shù)據(jù)中各特征之間的線性關(guān)系。在PCA中,協(xié)方差矩陣是求解特征值和特征向量的基礎(chǔ)。示例代碼#使用numpy計(jì)算協(xié)方差矩陣

cov_matrix=np.cov(data_scaled,rowvar=False)

#打印協(xié)方差矩陣

print("協(xié)方差矩陣:\n",cov_matrix)3.1.3求解特征值和特征向量特征值和特征向量是PCA的核心,它們決定了數(shù)據(jù)的主要方向。特征值的大小表示了該方向上的數(shù)據(jù)方差,特征向量則指出了數(shù)據(jù)的主要方向。示例代碼#求解協(xié)方差矩陣的特征值和特征向量

eigenvalues,eigenvectors=np.linalg.eig(cov_matrix)

#打印特征值和特征向量

print("特征值:\n",eigenvalues)

print("特征向量:\n",eigenvectors)3.1.4選擇主成分選擇主成分是基于特征值的大小。通常,我們會選擇那些解釋了數(shù)據(jù)大部分方差的主成分。這可以通過計(jì)算特征值的累積貢獻(xiàn)率來實(shí)現(xiàn)。示例代碼#計(jì)算特征值的累積貢獻(xiàn)率

total_var=sum(eigenvalues)

explained_var=[(i/total_var)foriinsorted(eigenvalues,reverse=True)]

cumulative_explained_var=np.cumsum(explained_var)

#打印累積貢獻(xiàn)率

print("累積貢獻(xiàn)率:\n",cumulative_explained_var)

#選擇解釋了80%方差的主成分

num_components=np.where(cumulative_explained_var>=0.8)[0][0]+1

print("選擇的主成分?jǐn)?shù)量:",num_components)3.1.5數(shù)據(jù)轉(zhuǎn)換最后一步是使用選擇的主成分對原始數(shù)據(jù)進(jìn)行轉(zhuǎn)換,得到降維后的數(shù)據(jù)。示例代碼#選擇前num_components個(gè)特征向量

principal_components=eigenvectors[:,:num_components]

#對原始數(shù)據(jù)進(jìn)行轉(zhuǎn)換

data_transformed=np.dot(data_scaled,principal_components)

#打印轉(zhuǎn)換后的數(shù)據(jù)

print("轉(zhuǎn)換后的數(shù)據(jù):\n",data_transformed)通過以上步驟,我們完成了PCA的實(shí)施,得到了降維后的數(shù)據(jù)。這不僅減少了數(shù)據(jù)的維度,也保留了數(shù)據(jù)的大部分信息,對于后續(xù)的機(jī)器學(xué)習(xí)模型訓(xùn)練非常有幫助。4PCA在特征選擇中的應(yīng)用4.1PCA用于降維主成分分析(PCA)是一種統(tǒng)計(jì)方法,用于識別數(shù)據(jù)集中的模式,通過將數(shù)據(jù)轉(zhuǎn)換到新的坐標(biāo)系統(tǒng)中,使得任何數(shù)據(jù)點(diǎn)都可以由一組互不相關(guān)的量(稱為“主成分”)來描述。PCA的主要目標(biāo)是通過減少數(shù)據(jù)的維度來簡化數(shù)據(jù)集,同時(shí)盡可能地保留數(shù)據(jù)的方差。4.1.1原理PCA通過以下步驟實(shí)現(xiàn)降維:數(shù)據(jù)標(biāo)準(zhǔn)化:確保所有特征具有相同的尺度,避免數(shù)值大的特征主導(dǎo)結(jié)果。計(jì)算協(xié)方差矩陣:協(xié)方差矩陣描述了數(shù)據(jù)集中特征之間的關(guān)系。計(jì)算特征值和特征向量:特征值表示主成分解釋的方差大小,特征向量指示主成分的方向。選擇主成分:根據(jù)特征值的大小選擇最重要的主成分,通常選擇解釋方差最大的前k個(gè)主成分。轉(zhuǎn)換數(shù)據(jù):使用選定的主成分作為新的坐標(biāo)軸,將原始數(shù)據(jù)投影到新的坐標(biāo)系統(tǒng)中,實(shí)現(xiàn)降維。4.1.2示例代碼假設(shè)我們有一個(gè)包含兩個(gè)特征的數(shù)據(jù)集,我們將使用PCA將其降維到一個(gè)特征。importnumpyasnp

fromsklearn.decompositionimportPCA

importmatplotlib.pyplotasplt

#創(chuàng)建數(shù)據(jù)

X=np.array([[-1,-1],[-2,-1],[-3,-2],[1,1],[2,1],[3,2]])

#數(shù)據(jù)標(biāo)準(zhǔn)化

X_std=(X-X.mean(axis=0))/X.std(axis=0)

#創(chuàng)建PCA實(shí)例,指定降維后的維度為1

pca=PCA(n_components=1)

#擬合數(shù)據(jù)

pca.fit(X_std)

#輸出解釋的方差比率

print("Explainedvarianceratio:",pca.explained_variance_ratio_)

#轉(zhuǎn)換數(shù)據(jù)

X_pca=pca.transform(X_std)

#可視化原始數(shù)據(jù)和PCA后的數(shù)據(jù)

plt.figure(figsize=(12,6))

plt.subplot(1,2,1)

plt.scatter(X[:,0],X[:,1])

plt.title('原始數(shù)據(jù)')

plt.subplot(1,2,2)

plt.scatter(X_pca[:,0],np.zeros((6,1)))#PCA后的數(shù)據(jù)只有一個(gè)維度,所以y軸都是0

plt.title('PCA降維后的數(shù)據(jù)')

plt.show()4.2PCA與特征重要性PCA雖然不直接評估特征的重要性,但它通過識別數(shù)據(jù)中的主成分,間接地指出了哪些特征組合對數(shù)據(jù)的方差貢獻(xiàn)最大。特征向量的系數(shù)可以用來理解哪些原始特征在主成分中扮演了重要角色。4.2.1示例代碼繼續(xù)使用上述數(shù)據(jù)集,我們將查看PCA的特征向量,以了解哪些特征對主成分的貢獻(xiàn)最大。#輸出特征向量

print("Featurevector:",ponents_)

#解釋特征向量

#特征向量的每個(gè)元素對應(yīng)原始數(shù)據(jù)的一個(gè)特征,元素的絕對值越大,表示該特征對主成分的貢獻(xiàn)越大。

#在這個(gè)例子中,我們只有一個(gè)主成分,所以特征向量只有一個(gè)。4.3PCA在實(shí)際數(shù)據(jù)集上的應(yīng)用案例4.3.1案例:Iris數(shù)據(jù)集Iris數(shù)據(jù)集是一個(gè)常用的多變量數(shù)據(jù)集,包含了150個(gè)樣本,每個(gè)樣本有4個(gè)特征:萼片長度、萼片寬度、花瓣長度和花瓣寬度。我們將使用PCA來降維,以便于可視化。fromsklearn.datasetsimportload_iris

fromsklearn.preprocessingimportStandardScaler

#加載數(shù)據(jù)

iris=load_iris()

X=iris.data

y=iris.target

#數(shù)據(jù)標(biāo)準(zhǔn)化

scaler=StandardScaler()

X_std=scaler.fit_transform(X)

#創(chuàng)建PCA實(shí)例,指定降維后的維度為2

pca=PCA(n_components=2)

#擬合數(shù)據(jù)

X_pca=pca.fit_transform(X_std)

#可視化PCA后的數(shù)據(jù)

plt.figure(figsize=(8,6))

plt.scatter(X_pca[:,0],X_pca[:,1],c=y,edgecolor='k',alpha=0.7)

plt.title('Iris數(shù)據(jù)集PCA降維后的可視化')

plt.xlabel('主成分1')

plt.ylabel('主成分2')

plt.grid(True)

plt.show()4.3.2解釋在這個(gè)案例中,我們使用PCA將Iris數(shù)據(jù)集的維度從4降到了2,這使得我們可以在二維平面上可視化數(shù)據(jù),同時(shí)保留了數(shù)據(jù)的大部分方差。通過觀察PCA后的數(shù)據(jù)點(diǎn)分布,我們可以發(fā)現(xiàn)不同種類的鳶尾花在主成分空間中被較好地分離,這表明PCA有效地提取了數(shù)據(jù)中的關(guān)鍵信息。通過以上內(nèi)容,我們了解了PCA在特征選擇中的應(yīng)用,包括其降維原理、如何通過特征向量理解特征重要性,以及在實(shí)際數(shù)據(jù)集上的應(yīng)用案例。PCA是一種強(qiáng)大的工具,可以幫助我們簡化數(shù)據(jù)集,同時(shí)保持?jǐn)?shù)據(jù)的關(guān)鍵特征,對于數(shù)據(jù)可視化和模型訓(xùn)練都有很大的幫助。5PCA的局限性與注意事項(xiàng)5.1PCA的假設(shè)條件PCA(主成分分析)在進(jìn)行特征選擇時(shí),基于以下假設(shè)條件:線性關(guān)系:PCA假設(shè)數(shù)據(jù)中的主要模式是線性的。這意味著,如果數(shù)據(jù)中的重要關(guān)系是非線性的,PCA可能無法有效地捕捉這些關(guān)系。方差最大化:PCA通過最大化數(shù)據(jù)的方差來確定主成分。因此,它對那些方差較大的特征更為敏感,而可能忽略方差較小但對模型預(yù)測同樣重要的特征。正態(tài)分布:PCA通常假設(shè)數(shù)據(jù)遵循正態(tài)分布。如果數(shù)據(jù)分布嚴(yán)重偏離正態(tài),PCA的結(jié)果可能不準(zhǔn)確。相關(guān)性:PCA尋找的是特征之間的相關(guān)性。如果特征之間沒有相關(guān)性,PCA的降維效果將不明顯。5.1.1示例代碼:檢查數(shù)據(jù)的線性關(guān)系importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearn.decompositionimportPCA

fromsklearn.datasetsimportmake_circles

#生成非線性數(shù)據(jù)

X,y=make_circles(n_samples=1000,factor=0.3,noise=0.1)

#應(yīng)用PCA

pca=PCA(n_components=2)

X_pca=pca.fit_transform(X)

#繪制原始數(shù)據(jù)和PCA后的數(shù)據(jù)

plt.figure(figsize=(12,6))

plt.subplot(1,2,1)

plt.scatter(X[:,0],X[:,1],c=y,cmap='viridis')

plt.title('原始數(shù)據(jù)')

plt.xlabel('特征1')

plt.ylabel('特征2')

plt.subplot(1,2,2)

plt.scatter(X_pca[:,0],X_pca[:,1],c=y,cmap='viridis')

plt.title('PCA后的數(shù)據(jù)')

plt.xlabel('主成分1')

plt.ylabel('主成分2')

plt.show()5.2PCA的局限性分析PCA的局限性主要體現(xiàn)在以下幾個(gè)方面:非線性數(shù)據(jù):PCA無法處理非線性關(guān)系的數(shù)據(jù),對于這類數(shù)據(jù),可能需要使用非線性降維技術(shù),如t-SNE或Isomap。信息丟失:PCA通過降維來減少數(shù)據(jù)的復(fù)雜性,但這一過程可能會導(dǎo)致信息的丟失。雖然保留了數(shù)據(jù)的大部分方差,但某些細(xì)節(jié)可能被忽略。解釋性:主成分可能難以解釋,因?yàn)樗鼈兪窃继卣鞯木€性組合。這在某些需要特征可解釋性的場景中可能是一個(gè)問題。敏感性:PCA對異常值非常敏感。單個(gè)異常值可能會顯著影響主成分的方向,從而影響整個(gè)分析的結(jié)果。5.2.1示例代碼:PCA對異常值的敏感性importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearn.decompositionimportPCA

#生成數(shù)據(jù)

np.random.seed(0)

X=np.random.randn(100,2)

X[0]=[10,10]#添加一個(gè)異常值

#應(yīng)用PCA

pca=PCA(n_components=2)

X_pca=pca.fit_transform(X)

#繪制原始數(shù)據(jù)和PCA后的數(shù)據(jù)

plt.figure(figsize=(12,6))

plt.subplot(1,2,1)

plt.scatter(X[:,0],X[:,1],c='blue')

plt.scatter(X[0,0],X[0,1],c='red')#異常值

plt.title('原始數(shù)據(jù)')

plt.xlabel('特征1')

plt.ylabel('特征2')

plt.subplot(1,2,2)

plt.scatter(X_pca[:,0],X_pca[:,1],c='blue')

plt.scatter(X_pca[0,0],X_pca[0,1],c='red')#異常值

plt.title('PCA后的數(shù)據(jù)')

plt.xlabel('主成分1')

plt.ylabel('主成分2')

plt.show()5.3如何選擇合適的主成分?jǐn)?shù)量選擇合適的主成分?jǐn)?shù)量是PCA應(yīng)用中的關(guān)鍵步驟。以下是一些常用的方法:解釋的方差比:選擇能夠解釋數(shù)據(jù)總方差的大部分(例如90%或95%)的主成分?jǐn)?shù)量。肘部法則:繪制主成分的累積解釋方差比,選擇曲線開始平緩的點(diǎn)作為主成分?jǐn)?shù)量。交叉驗(yàn)證:通過交叉驗(yàn)證評估不同主成分?jǐn)?shù)量下的模型性能,選擇性能最佳的主成分?jǐn)?shù)量。5.3.1示例代碼:使用解釋的方差比選擇主成分?jǐn)?shù)量importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearn.decompositionimportPCA

fromsklearn.datasetsimportload_iris

#加載數(shù)據(jù)

data=load_iris()

X=data.data

#應(yīng)用PCA

pca=PCA()

X_pca=pca.fit_transform(X)

#繪制解釋的方差比

plt.figure(figsize=(10,6))

plt.plot(np.cumsum(pca.explained_variance_ratio_))

plt.xlabel('主成分?jǐn)?shù)量')

plt.ylabel('累積解釋的方差比')

plt.title('解釋的方差比')

plt.grid(True)

plt.show()

#根據(jù)解釋的方差比選擇主成分?jǐn)?shù)量

cumulative_variance=np.cumsum(pca.explained_variance_ratio_)

n_components=np.argmax(cumulative_variance>=0.95)+1

print(f"選擇的主成分?jǐn)?shù)量為:{n_components}")通過以上分析和示例,我們可以看到PCA在特征選擇中的局限性和注意事項(xiàng),以及如何合理地選擇主成分的數(shù)量,以達(dá)到最佳的降維效果。6高級PCA主題6.1核PCA(KernelPCA)6.1.1原理核PCA是主成分分析(PCA)的一種擴(kuò)展,它通過使用核函數(shù)將數(shù)據(jù)映射到高維空間,從而解決非線性數(shù)據(jù)的特征選擇問題。在高維空間中,原本非線性的關(guān)系可能變得線性,這樣就可以應(yīng)用傳統(tǒng)的PCA方法進(jìn)行降維。核函數(shù)的選擇是關(guān)鍵,常見的核函數(shù)包括線性核、多項(xiàng)式核、高斯核等。6.1.2內(nèi)容核PCA的步驟如下:選擇核函數(shù):根據(jù)數(shù)據(jù)的特性選擇合適的核函數(shù)。計(jì)算核矩陣:使用所選核函數(shù)計(jì)算數(shù)據(jù)點(diǎn)之間的相似度矩陣。中心化核矩陣:對核矩陣進(jìn)行中心化處理,消除數(shù)據(jù)的偏移。求解特征值和特征向量:在中心化后的核矩陣中求解特征值和特征向量。選擇主成分:根據(jù)特征值的大小選擇主成分,進(jìn)行降維。6.1.3示例代碼假設(shè)我們有以下非線性數(shù)據(jù):importnumpyasnp

fromsklearn.decompositionimportKernelPCA

importmatplotlib.pyplotasplt

#生成非線性數(shù)據(jù)

np.random.seed(0)

X=np.linspace(-4,4,1000)[:,np.newaxis]

X=np.hstack((X,X**2))

X=np.hstack((X,X**3))

#應(yīng)用核PCA

kpca=KernelPCA(kernel="rbf",n_components=1,gamma=0.1)

X_kpca=kpca.fit_transform(X)

#可視化結(jié)果

plt.figure(figsize=(12,6))

plt.subplot(1,2,1)

plt.scatter(X[:,0],X[:,1],c='k',label='原始數(shù)據(jù)')

plt.xlabel('特征1')

plt.ylabel('特征2')

plt.legend()

plt.subplot(1,2,2)

plt.scatter(X_kpca[:,0],np.zeros_like(X_kpca[:,0]),c='r',label='核PCA降維后數(shù)據(jù)')

plt.xlabel('主成分')

plt.legend()

plt.show()這段代碼首先生成了一個(gè)非線性的數(shù)據(jù)集,然后使用KernelPCA類進(jìn)行降維,最后可視化了原始數(shù)據(jù)和降維后的數(shù)據(jù)。6.2稀疏PCA(SparsePCA)6.2.1原理稀疏PCA是一種PCA的變體,它在尋找主成分時(shí)引入了稀疏性約束,使得主成分只由一部分特征構(gòu)成,從而可以進(jìn)行特征選擇。稀疏PCA通過優(yōu)化問題來實(shí)現(xiàn),目標(biāo)是最小化重構(gòu)誤差的同時(shí)最大化主成分的稀疏性。6.2.2內(nèi)容稀疏PCA的步驟包括:初始化:設(shè)置稀疏性參數(shù)。優(yōu)化:通過求解優(yōu)化問題找到稀疏的主成分。降維:使用找到的稀疏主成分進(jìn)行數(shù)據(jù)降維。6.2.3示例代碼使用sklearn的SparsePCA類進(jìn)行稀疏PCA:importnumpyasnp

fromsklearn.datasetsimportload_digits

fromsklearn.decompositionimportSparsePCA

importmatplotlib.pyplotasplt

#加載數(shù)據(jù)

digits=load_digits()

X=digits.data

#應(yīng)用稀疏PCA

spca=SparsePCA(n_components=2,alpha=1)

X_spca=spca.fit_transform(X)

#可視化結(jié)果

plt.figure(figsize=(10,6))

plt.scatter(X_spca[:,0],X_spca[:,1],c=digits.target,cmap='viridis')

plt.colorbar()

plt.xlabel('主成分1')

plt.ylabel('主成分2')

plt.title('稀疏PCA降維后的手寫數(shù)字?jǐn)?shù)據(jù)')

plt.show()這段代碼加載了手寫數(shù)字?jǐn)?shù)據(jù)集,然后使用SparsePCA進(jìn)行降維,并可視化了降維后的結(jié)果。6.3增量PCA(IncrementalPCA)6.3.1原理增量PCA是一種可以處理大數(shù)據(jù)集的PCA方法,它通過分批處理數(shù)據(jù)來實(shí)現(xiàn)。增量PCA在每次處理數(shù)據(jù)批次時(shí)更新主成分,而不是一次性處理所有數(shù)據(jù)。這種方法在內(nèi)存有限的情況下特別有用,因?yàn)樗恍枰鎯Ξ?dāng)前批次的數(shù)據(jù)。6.3.2內(nèi)容增量PCA的步驟如下:初始化:設(shè)置主成分的數(shù)量和批次大小。分批處理:將數(shù)據(jù)集分成多個(gè)批次。更新主成分:對每個(gè)批次的數(shù)據(jù)進(jìn)行PCA,并更新主成分。降維:使用最終的主成分進(jìn)行數(shù)據(jù)降維。6.3.3示例代碼使用sklearn的IncrementalPCA類進(jìn)行增量PCA:importnumpyasnp

fromsklearn.decompositionimportIncrementalPCA

fromsklearn.datasetsimportfetch_20newsgroups_vectorized

fromsklearn.feature_extraction.textimportTfidfVectorizer

#加載數(shù)據(jù)

newsgroups=fetch_20newsgroups_vectorized(subset='all')

vectorizer=TfidfVectorizer(max_features=1000)

X=vectorizer.fit_transform(newsgroups.data)

#應(yīng)用增量PCA

ipca=IncrementalPCA(n_components=100,batch_size=1000)

X_ipca=ipca.fit_transform(X)

#打印降維后的數(shù)據(jù)形狀

print("降維后的數(shù)據(jù)形狀:",X_ipca.shape)這段代碼加載了新聞組數(shù)據(jù)集,使用TF-IDF向量化文本數(shù)據(jù),然后使用IncrementalPCA進(jìn)行降維,最后打印了降維后的數(shù)據(jù)形狀。7數(shù)據(jù)挖掘:特征選擇:主成分分析PCA與其他方法的比較7.1PCA與LDA的對比7.1.1原理與內(nèi)容主成分分析(PCA)和線性判別分析(LDA)都是數(shù)據(jù)挖掘中常用的特征選擇方法,但它們的目標(biāo)和應(yīng)用場景有所不同。PCAPCA是一種無監(jiān)督學(xué)習(xí)方法,其目標(biāo)是通過線性變換將原始數(shù)據(jù)轉(zhuǎn)換到一個(gè)新的坐標(biāo)系統(tǒng)中,使得數(shù)據(jù)在新坐標(biāo)軸上的方差最大化。這個(gè)過程可以減少數(shù)據(jù)的維度,同時(shí)保留數(shù)據(jù)的大部分信息。PCA適用于數(shù)據(jù)降維和特征提取,尤其在數(shù)據(jù)沒有明確的類別標(biāo)簽時(shí)。LDALDA是一種有監(jiān)督學(xué)習(xí)方法,它在考慮類別信息的基礎(chǔ)上進(jìn)行特征選擇。LDA的目標(biāo)是找到一個(gè)投影方向,使得不同類別的數(shù)據(jù)在投影后的距離最大化,而同一類別的數(shù)據(jù)在投影后的距離最小化。LDA適用于分類問題,當(dāng)數(shù)據(jù)有明確的類別標(biāo)簽時(shí),LDA可以更有效地進(jìn)行特征選擇。7.1.2代碼示例假設(shè)我們有一組二維數(shù)據(jù),其中包含兩個(gè)類別的樣本,我們將使用Python的sklearn庫來演示PCA和LDA的差異。importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearn.decompositionimportPCA

fromsklearn.discriminant_analysisimportLinearDiscriminantAnalysis

#生成數(shù)據(jù)

np.random.seed(0)

X=np.r_[np.random.randn(20,2)-[2,2],np.random.randn(20,2)+[2,2]]

y=[0]*20+[1]*20

#PCA降維

pca=PCA(n_components=1)

X_pca=pca.fit_transform(X)

#LDA降維

lda=LinearDiscriminantAnalysis(n_components=1)

X_lda=lda.fit_transform(X,y)

#繪制結(jié)果

plt.figure()

plt.scatter(X[:,0],X[:,1],c=y,alpha=0.8)

plt.title('原始數(shù)據(jù)')

plt.show()

plt.figure()

plt.scatter(X_pca,np.zeros(40),c=y,alpha=0.8)

plt.title('PCA降維后的數(shù)據(jù)')

plt.show()

plt.figure()

plt.scatter(X_lda,np.zeros(40),c=y,alpha=0.8)

plt.title('LDA降維后的數(shù)據(jù)')

plt.show()解釋在這個(gè)例子中,我們首先生成了兩個(gè)類別的二維數(shù)據(jù)。然后,我們使用PCA和LDA分別將數(shù)據(jù)降維到一維。最后,我們繪制了原始數(shù)據(jù)、PCA降維后的數(shù)據(jù)和LDA降維后的數(shù)據(jù)。從圖中可以看出,PCA降維后的數(shù)據(jù)沒有考慮類別信息,而LDA降維后的數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論