日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习实战(十一)利用PCA来简化数据

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习实战(十一)利用PCA来简化数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

    • 第十三章 利用PCA來簡化數據
      • 13.1 降維技術
        • 13.1.1 主成分分析(PrincipalComponentAnalysis,PCA)
        • 13.1.2 因子分析(Factor Analysis)
        • 13.1.3 獨立成分分析(Independent Component Analysis, ICA)
      • 13.2 PCA
        • 13.2.1 移動坐標軸和降維
        • 13.2.2 統計學基本概念
        • 13.2.3 在Numpy中實現PCA
      • 13.3 實例:利用PCA降維技術對半導體制造數據降維
      • 13.4 總結

第十三章 利用PCA來簡化數據

13.1 降維技術

數據降維的原因:

1)可以使數據顯示更加容易
2)使得數據集更容易使用
3)降低算法計算開銷
4)去除噪聲
5)使得結果易懂

降維主要有三種方法,依次介紹如下。

13.1.1 主成分分析(PrincipalComponentAnalysis,PCA)

在 PCA中,數據從原來的坐標系轉換到了新的坐標系,新坐標系的選擇是由數據本身決定的。第一個新坐標軸選擇的是原始數據中方差最大的方向,第二個新坐標軸的選擇和第一個坐標軸正交且具有最大方差的方向。該過程一直重復,重復次數為原始數據中特征的數目。我們會發現,大部分方差都包含在最前面的幾個新坐標軸中。因此,我們可以忽略余下的坐標軸,即對數據進行了降維處理。

13.1.2 因子分析(Factor Analysis)

在因子分析中,我們假設在觀察數據的生成 中 有一 些觀察 不 到的隱 變量 ( latentvariable )。假設觀察數據是這些隱變量和某些噪聲的線性組合 。那么隱變量的數據可能比觀察數據的數目少,也就是說通過找到隱變量就可以實現數據的降維。

13.1.3 獨立成分分析(Independent Component Analysis, ICA)

ICA假設數據是從 N 個數據源生成的,這一點和因子分析有些類似。 假設數據為多個數據源的混合觀察結果,這些數據源之間在統計上是相互獨立的,而在 ? 0 人中只假設數據是不相關的。同因子分析一樣,如果數據源的數目少于觀察數據的數目,則可以實現降維過程。

PCA應用最為廣泛,下面來介紹PCA。

13.2 PCA

13.2.1 移動坐標軸和降維

第一步:坐標軸旋轉

圖13-1中的大量數據點,則B是覆蓋最多的線條。PCA中,我們對數據的坐標進行了旋轉,該旋轉過程取決于數據本身。

第一條坐標軸:旋轉到覆蓋數據的最大方差位置(也就是覆蓋數據最大差異性的坐標軸),即圖中的直線B,數據的最大方差給出了數據的最重要的信息。

第二條坐標軸:選擇與第一條坐標軸垂直的坐標軸,也就是正交坐標軸(覆蓋數據次打差異性的坐標軸)。

利用PCA,我們將數據坐標軸旋轉至數據角度上的那些重要的方向。

坐標軸旋轉并未減少數據的維度

第二步:降維

如上圖,其中包含著 3 個不同的類別。要區分這 3 個 類 別 ,可以使用決策樹。我們還記得決策樹每次都是基于一個特征來做決策的。我 們會發現,在 x軸上可以找到一些值,這些值能夠很好地將這 3 個類別分開。這 樣 ,我們就可能得到一些規則,比 如 當 0 < 4 ) 時 ,數據屬于類別 0 。如果使用 SVM這樣稍微復雜一點的分類器,我們就會得到更好的分類面和分類規則,比如當(w0 * x + w1 * y + b) > 0 時 ,數據也屬于類別 0 。 SVM可能比決策樹得到更好的分類間隔,但是分類超平面卻很難解釋。

通過PCA進行降維處理,我們就可以同時獲得 SVM和決策樹的優點:

1)一 方 面 ,得到了和決策樹一樣簡單的分類器,同時分類間隔和 SVM一樣好,如上圖,其中的數據來自于上面的圖并經 過PCA轉換之后繪制而成的,如果僅使用原始數據,那么這里的間隔會比決策樹的間隔更大。

2) 另 外 ,由于只需要考慮一維信息,因此數據就可以通過比 S V M 簡單得多的很容易采用的規則進行區分 。

在上圖中,我們只需要一維信息即可,因為另一維信息只是對分類缺乏貢獻的噪聲數據,在二位平面下,這一點看上去微不足道,但是如果在高維空間下則意義重大。

PCA實現:

第一個主成分:數據差異性最大(即方差最大)的方向

第二個主成分:數據差異性的次大(與第一個主成分方向正交)的方向

如何求取主成分的值:

數據集的協方差陣及其特征值分析

如何轉化到特征空間:

得到協方差矩陣的特征向量,就可以保留最大的N個值,這些特征向量也給出了B個最重要特征的真實結構,我們可以通過將數據乘上這N個特征向量而將其轉換到新的空間。

13.2.2 統計學基本概念

1)均值:X?ˉ?ˉ?ˉ?ˉ??=?n?i=1?X?i?n??Xˉ=∑i=1nXin

2)標準差:s=?n?i=1?(X?i??X?ˉ?ˉ?ˉ?ˉ?ˉ??)?2?n?1???????????????????????s=∑i=1n(Xi?Xˉ)2n?1

3)方差:s?2?=?n?i=1?(X?i??X?ˉ?ˉ?ˉ?ˉ?ˉ??)?2?n?1??s2=∑i=1n(Xi?Xˉ)2n?1

4)協方差:

標準差和方差一般是用來描述一維數據的,但現實生活中常常遇到含有多維數據的數據集,協方差就是用來度量兩個隨機變量關系的統計量。

可以通俗的理解為:兩個變量在變化過程中是同方向變化?還是反方向變化?同向或反向程度如何?
你變大,同時我也變大,說明兩個變量是同向變化的,這時協方差就是正的。
你變大,同時我變小,說明兩個變量是反向變化的,這時協方差就是負的。
從數值來看,協方差的數值越大,兩個變量同向程度也就越大。反之亦然。

公式:
Cov(X,Y)=?n?i=1?(X?i??X?ˉ?ˉ?ˉ?ˉ?ˉ??)(Y?i??Y?ˉ?ˉ?ˉ?ˉ??)n?1?=E[(X?μ?x?)(Y?μ?y?)]?Cov(X,Y)=∑i=1n(Xi?Xˉ)(Yi?Yˉ)n?1=E[(X?μx)(Y?μy)]

性質:

Cov(X,X)=var(X)?Cov(X,X)=var(X)
Cov(X,Y)=Cov(Y,X)?Cov(X,Y)=Cov(Y,X)

意義:如果有X,Y兩個變量,每個時刻的“X值與其均值之差”乘以“Y值與其均值之差”得到一個乘積,再對這每時刻的乘積求和并求出均值(其實是求“期望”,但就不引申太多新概念了,簡單認為就是求均值了)。

13.2.3 在Numpy中實現PCA

將數據轉換為前N個主成分的偽代碼如下:

from numpy import * import matplotlib.pyplot as plt # 加載數據 def loadDataSet(filename,delim = '\t'):fr = open(filename)stringArr = [line.strip().split(delim) for line in fr.readlines()]dataArr = [map(float,line) for line in stringArr]print(mean(mat(dataArr)))return mat(dataArr)def pca(dataMat,topN=999999):# 形成樣本矩陣,樣本中心化meanVals= mean(dataMat,axis=0)meanRemoved = dataMat - meanVals# 計算樣本矩陣的協方差矩陣covMat = cov(meanRemoved,rowvar=0)# 對協方差矩陣進行特征值分解,選取最大的 p 個特征值對應的特征向量組成投影矩陣eigVals,eigVects = linalg.eig(mat(covMat))eigValInd = argsort(eigVals)eigValInd = eigValInd[:-(topN+1):-1]redEigVects = eigVects[:,eigValInd]# 對原始樣本矩陣進行投影,得到降維后的新樣本矩陣lowDDataMat = meanRemoved * redEigVectsreconMat = (lowDDataMat * redEigVects.T)+meanValsreturn lowDDataMat,reconMatif __name__=='__main__':dataMat = mat(loadtxt('testSet.txt'))lowMat,reconMat = pca(dataMat,1)fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')plt.show()

書中代碼運行有誤

相比書中的修改:dataMat = mat(loadtxt('testSet.txt'))

結果:


上圖顯示了原始數據集和第一主成分

13.3 實例:利用PCA降維技術對半導體制造數據降維

缺失值處理:取平均值代替缺失值,平均值根據非NaN得到。

from numpy import * import matplotlib.pyplot as plt # 加載數據 def loadDataSet(filename,delim = '\t'):fr = open(filename)stringArr = [line.strip().split(delim) for line in fr.readlines()]dataArr = [map(float,line) for line in stringArr]return mat(dataArr)def pca(dataMat,topN=999999):# 形成樣本矩陣,樣本中心化meanVals= mean(dataMat,axis=0)meanRemoved = dataMat - meanVals# 計算樣本矩陣的協方差矩陣covMat = cov(meanRemoved,rowvar=0)# 對協方差矩陣進行特征值分解,選取最大的 p 個特征值對應的特征向量組成投影矩陣eigVals,eigVects = linalg.eig(mat(covMat))eigValInd = argsort(eigVals)eigValInd = eigValInd[:-(topN+1):-1]redEigVects = eigVects[:,eigValInd]# 對原始樣本矩陣進行投影,得到降維后的新樣本矩陣lowDDataMat = meanRemoved * redEigVectsreconMat = (lowDDataMat * redEigVects.T)+meanValsreturn lowDDataMat,reconMatdef replaceNanWithMean():datMat = loadDataSet('secom.data', ' ')numFeat = shape(datMat)[1]for i in range(numFeat):meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) #values that are not NaN (a number)datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal #set NaN values to meanreturn datMatif __name__=='__main__':#加載數據dataMat = replaceNanWithMean()#去除均值meanVals = mean(dataMat, axis=0)meanRemoved = dataMat - meanVals#計算協方差covMat = cov(meanRemoved, rowvar=0)#特征值分析eigVals, eigVects = linalg.eig(mat(covMat))print (eigVals)

結果:

結果說明:

我們會發現其中很多值都是 0嗎?實 際 上 ,其中有超過 2 0 % 的特征值都是 0 。這就意味著這些特征都是其他特征的副本,也就是 說 ,它們可以通過其他特征來表示,而本身并沒有提供額外的信息。

接 下 來 ,我們了解一下部分數值的數量級。最 前 面 15 個 值的 數量 級 大 于 105 ,實際上那以后 的 值 都 變 得 非 常 小 。這 就相 當 于 告 訴 我 們 只 有 部 分 重 要 特 征 ,重要特征的數目也很快就會下 降 。

最 后 ,我們可能會注意到有一些小的負值,它們主要源自數值誤差應該四舍五入成 0 。

圖13-4 中給出了總方差的百分比,可以看出來在開始的幾個主成分之后,方差就會迅速下降。

表 13-1 給出了這些主成分所對應的方差百分比和累積方差百分比。瀏 覽 “ 累積方差百分比( % )” 這一列就會注意到 , 前六個主成分就覆蓋了數據 96.8% 的方 差 , 而前 20 個主成分覆蓋了 99.3%的方差。這就表明了,如果保留前 6 個而去除后 584 個 主 成 分 ,我們就可以實現大概 100 : 1 的壓縮比。另 外 ,由于舍棄了噪聲的主成分,將后面的主成分去除便使得數據更加干凈。

于 是 ,我們可以知道在數據集的前面多個主成分中所包含的信息量。我們可以嘗試不同的截斷值來檢驗它們的性能。有些人使用能包含90%信息量的主成分數量, 而其他人使用前20個主成分。 我們無法精確知道所需要的主成分數目, 必須通過在實驗中取不同的值來確定。有效的主成分數目則取決于數據集和具體應用。
上述分析能夠得到所用到的主成分數目, 然后我們可以將該數目輸人到PCA算法中, 最后得到約簡后數據就可以在分類器中使用了。

13.4 總結

降維技術使得數據變得更易使用,并且能夠去除數據中的噪聲,使得其他機器學習任務更加精確。

總結

以上是生活随笔為你收集整理的机器学习实战(十一)利用PCA来简化数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。