制作網(wǎng)站比較大的幾家公司東莞seo優(yōu)化方案
目錄
- 1. 主體思想
- 2. 算法流程
- 3. 代碼實踐
1. 主體思想
主成分分析(Principal Component Analysis)常用于實現(xiàn)數(shù)據(jù)降維,它通過線性變換將高維數(shù)據(jù)映射到低維空間,使得映射后的數(shù)據(jù)具有最大的方差。主成分可以理解成數(shù)據(jù)集中的特征,具體來說,第一主成分是數(shù)據(jù)中方差最大的特征(即該特征下的值的方差最大),數(shù)據(jù)點在該方向有最大的擴散性(即在該方向上包含的信息量最多)。第二主成分與第一主成分正交(即與第一主成分無關(guān)),并在所有可能正交方向中,選擇方差次大的方向。然后,第三主成分與前兩個主成分正交,且選擇在其余所有可能正交方向中有最大方差的方向,以此類推,有多少特征就有多少主成分。
- 主成分上的方差越小,說明該特征上的取值可能都相同,那這一個特征的取值對樣本而言就沒有意義,因為其包含的信息量較少。
- 主成分上的方差越大,說明該特征上的值越分散,那么它包含的信息就越多,對數(shù)據(jù)降維就越有幫助。
下圖1中,紫色線方向上數(shù)據(jù)的方差最大(該方向上點的分布最分散,包含了更多的信息量),則可以將該方向上的特征作為第一主成分。
主成分分析的優(yōu)點2:
- 數(shù)據(jù)降維:PCA能夠減少數(shù)據(jù)的維度(復(fù)雜度),提高計算效率。
- 數(shù)據(jù)可視化:通過PCA降維,可以將數(shù)據(jù)可視化到更低維度的空間中,便于數(shù)據(jù)的觀察和理解。
- 去除噪聲: 主成分分析可以把數(shù)據(jù)的主要特征提取出來(數(shù)據(jù)的主要特征集中在少數(shù)幾個主成分上),忽略小的、可能是噪聲的特征,同時可以防止過擬合。
- 去除冗余: 在原始數(shù)據(jù)中,很多情況下多個變量之間存在高度相關(guān)性,導(dǎo)致數(shù)據(jù)冗余。PCA通過新的一組正交的主成分來描述數(shù)據(jù),可以最大程度降低原始的數(shù)據(jù)冗余。
2. 算法流程
- 數(shù)據(jù)預(yù)處理:中心化 x i ? x ˉ x_i-\bar{x} xi??xˉ (每列的每個值都減去該列的均值)。
- 求樣本的協(xié)方差矩陣 1 m X T X \frac{1}{m}X^TX m1?XTX(m為樣本數(shù)量,X為樣本矩陣)。
- 計算協(xié)方差矩陣的特征值和對應(yīng)的特征向量。
- 選擇最大的 K K K 個特征值對應(yīng)的 K K K 個特征向量構(gòu)造特征矩陣。
- 將中心化后的數(shù)據(jù)投影到特征矩陣上。
- 輸出投影后的數(shù)據(jù)集。
協(xié)方差矩陣的計算(二維)
C = 1 m X T X = ( C o v ( x , x ) C o v ( x , y ) C o v ( y , x ) C o v ( y , y ) ) = ( 1 m ∑ i = 1 m x i 2 1 m ∑ i = 1 m x i y i 1 m ∑ i = 1 m y i x i 1 m ∑ i = 1 m y i 2 ) C=\frac{1}{m}X^TX=\begin{pmatrix}Cov(x,x)&Cov(x,y) \\Cov(y,x)&Cov(y,y)\end{pmatrix} =\begin{pmatrix} \frac{1}{m}\sum_{i=1}^{m}x_i^2&\frac{1}{m}\sum_{i=1}^{m}x_iy_i \\ \frac{1}{m}\sum_{i=1}^{m}y_ix_i&\frac{1}{m}\sum_{i=1}^{m}y_i^2 \end{pmatrix} C=m1?XTX=(Cov(x,x)Cov(y,x)?Cov(x,y)Cov(y,y)?)=(m1?∑i=1m?xi2?m1?∑i=1m?yi?xi??m1?∑i=1m?xi?yi?m1?∑i=1m?yi2??)
其中, x x x 和 y y y 表示不同的特征列, c o v ( x , x ) = D ( x ) = 1 m ∑ i = 1 m ( x i ? x ˉ ) 2 cov(x,x)=D(x)=\frac{1}{m}\sum_{i=1}^{m}(x_i-\bar{x})^2 cov(x,x)=D(x)=m1?∑i=1m?(xi??xˉ)2(協(xié)方差矩陣中的 x i x_i xi? 表示已經(jīng)中心化后的值),協(xié)方差矩陣是一個對稱的矩陣,且對角線元素是各個特征(一列即為一個特征)的方差。
協(xié)方差矩陣的計算(三維)
C = ( C o v ( x , x ) C o v ( x , y ) C o v ( x , z ) C o v ( y , x ) C o v ( y , y ) C o v ( y , z ) C o v ( z , x ) C o v ( z , y ) C o v ( z , z ) ) C=\begin{pmatrix} Cov(x,x)&Cov(x,y)&Cov(x,z) \\ Cov(y,x)&Cov(y,y)&Cov(y,z) \\ Cov(z,x)&Cov(z,y)&Cov(z,z) \end{pmatrix} C= ?Cov(x,x)Cov(y,x)Cov(z,x)?Cov(x,y)Cov(y,y)Cov(z,y)?Cov(x,z)Cov(y,z)Cov(z,z)? ?
舉例說明
下面共5個樣本,每個樣本兩個特征,第一列的均值為2.2,第二列的均值為3.8。
-
數(shù)據(jù)中心化(每列的每個值都減去該列的均值)
-
計算協(xié)方差矩陣
C = [ 1.7 1.05 1.05 5.7 ] C=\begin{bmatrix} 1.7&1.05 \\ 1.05&5.7 \end{bmatrix} C=[1.71.05?1.055.7?] -
計算特征值與特征向量
e i g e n v a l u e s = [ 1.4411286 , 5.9588714 ] eigenvalues=[1.4411286,5.9588714] eigenvalues=[1.4411286,5.9588714]
e i g e n v e c t o r s = [ ? 0.97092685 ? 0.23937637 0.23937637 ? 0.97092685 ] eigenvectors=\begin{bmatrix} -0.97092685&-0.23937637\\ 0.23937637&-0.97092685 \end{bmatrix} eigenvectors=[?0.970926850.23937637??0.23937637?0.97092685?] -
選擇最大的一個特征值(將數(shù)據(jù)降為一維)5.9588714,對應(yīng)的特征向量為
[ ? 0.23937637 ? 0.97092685 ] \begin{bmatrix} -0.23937637\\ -0.97092685 \end{bmatrix} [?0.23937637?0.97092685?] -
將中心化后的數(shù)據(jù)投影到特征矩陣
[ ? 1.2 ? 1.8 ? 0.2 0.2 ? 1.2 1.2 0.8 ? 2.8 1.8 3.2 ] ? [ ? 0.23937637 ? 0.97092685 ] = [ 2.03491998 ? 0.1463101 ? 0.87786057 2.52709409 ? 3.5378434 ] \begin{bmatrix} -1.2&-1.8 \\ -0.2&0.2 \\ -1.2&1.2 \\ 0.8&-2.8 \\ 1.8&3.2 \end{bmatrix}*\begin{bmatrix} -0.23937637\\ -0.97092685 \end{bmatrix}=\begin{bmatrix} 2.03491998\\ -0.1463101\\ -0.87786057\\ 2.52709409\\ -3.5378434 \end{bmatrix} ??1.2?0.2?1.20.81.8??1.80.21.2?2.83.2? ??[?0.23937637?0.97092685?]= ?2.03491998?0.1463101?0.877860572.52709409?3.5378434? ?
[ 2.03491998 ? 0.1463101 ? 0.87786057 2.52709409 ? 3.5378434 ] \begin{bmatrix} 2.03491998\\ -0.1463101\\ -0.87786057\\ 2.52709409\\ -3.5378434 \end{bmatrix} ?2.03491998?0.1463101?0.877860572.52709409?3.5378434? ?即為降維后的數(shù)據(jù)。
3. 代碼實踐
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix
import numpy as np
import matplotlib.pyplot as plt# 載入手寫體數(shù)據(jù)集并切分為訓(xùn)練集和測試集
digits = load_digits()
x_data = digits.data
y_data = digits.target
x_train, x_test, y_train, y_test = train_test_split(x_data,y_data)
x_data.shape
運行結(jié)果
(1797, 64)
# 創(chuàng)建神經(jīng)網(wǎng)絡(luò)模型,包含兩個隱藏層,每個隱藏層的神經(jīng)元數(shù)量分別為
# 100和50,最大迭代次數(shù)為500
mlp = MLPClassifier(hidden_layer_sizes=(100,50) ,max_iter=500)
mlp.fit(x_train,y_train)
# 數(shù)據(jù)中心化
def zeroMean(dataMat):# 按列求平均,即各個特征的平均meanVal = np.mean(dataMat, axis=0) newData = dataMat - meanValreturn newData, meanVal# PCA降維,top表示要將數(shù)據(jù)降維到幾維
def pca(dataMat,top):# 數(shù)據(jù)中心化newData,meanVal=zeroMean(dataMat) # np.cov用于求協(xié)方差矩陣,參數(shù)rowvar=0說明數(shù)據(jù)一行代表一個樣本covMat = np.cov(newData, rowvar=0)# np.linalg.eig求矩陣的特征值和特征向量eigVals, eigVects = np.linalg.eig(np.mat(covMat))# 對特征值從小到大排序eigValIndice = np.argsort(eigVals)# 從eigValIndice中提取倒數(shù)top個索引,并按照從大到小的順序返回一個切片列表# 后一個 -1 表示切片的方向為從后往前,以負的步長(-1)進行迭代n_eigValIndice = eigValIndice[-1:-(top+1):-1]# 最大的n個特征值對應(yīng)的特征向量n_eigVect = eigVects[:,n_eigValIndice]# 低維特征空間的數(shù)據(jù)lowDDataMat = newData*n_eigVect# 利用低緯度數(shù)據(jù)來重構(gòu)數(shù)據(jù)reconMat = (lowDDataMat*n_eigVect.T) + meanVal# 返回低維特征空間的數(shù)據(jù)和重構(gòu)的矩陣return lowDDataMat,reconMat
# 繪制降維后的數(shù)據(jù)及分類結(jié)果,共10個類
lowDDataMat, reconMat = pca(x_data, 2)
predictions = mlp.predict(x_data)
x = np.array(lowDDataMat)[:,0]
y = np.array(lowDDataMat)[:,1]
plt.scatter(x,y,c=y_data)
# 將數(shù)據(jù)降為3維
lowDDataMat, reconMat = pca(x_data,3)
# 繪制三維數(shù)據(jù)及分類結(jié)果,共10個類
x = np.array(lowDDataMat)[:,0]
y = np.array(lowDDataMat)[:,1]
z = np.array(lowDDataMat)[:,2]
ax = plt.figure().add_subplot(111, projection = '3d')
ax.scatter(x, y, z, c = y_data, s = 10) #點為紅色三角形
主成分分析(PCA) ??
主成分分析(PCA)理解 ??