《機器學習實戰》原始碼解析(九) PCA

2021-10-06 04:49:39 字數 2699 閱讀 1114

from numpy import

*import matplotlib

import matplotlib.pyplot as plt

#pca演算法,共兩個函式

#第乙個函式,用於清洗資料

#輸入:原始資料集,分隔符

#輸出:清洗後的資料集,乙個可以計算的矩陣

defloaddataset

(filename,delim=

'\t'):

fr =

open

(filename)

stringarr =

[line.strip(

).split(delim)

for line in fr.readlines()]

dataarr =

[list

(map

(float

,line)

)for line in stringarr]

return mat(dataarr)

#第二個函式,pca主函式

#輸入:資料集,主成分個數.注意這裡的資料集矩陣中每行代表乙個元素,每個元素有兩個特徵(書本中的資料)值

#輸出:

defpca

(datamat,topnfeat=

9999999):

#求每列(即特徵值)的平均值(壓縮為1行),若為1則是求每行平均值(壓縮為1列)

meanvals = mean(datamat,axis=0)

meanremoved = datamat - meanvals#平移到以0為中心的地方,便於計算

covmat =cov(meanremoved,rowvar =0)

#計算協方差矩陣

ei**als,ei**ects = linalg.eig(mat(covmat)

)#計算特徵值,特徵向量

ei**alind = argsort(ei**als)

#預設快排,從小到大進行排序

#得到topnfeat個特徵值,大的特徵值排在前,若topnfeat為1,則取1個特徵值

ei**alind = ei**alind[:-

(topnfeat+1)

:-1]

#獲得topnfeat個主成分,即座標軸

redei**ects = ei**ects[

:,ei**alind]

#將對應topnfeat個特徵值對應的特徵向量取出來

#利用主成分矩陣將原中心化後的矩陣轉為新的矩陣

lowddatamat = meanremoved * redei**ects

#還原降維後的矩陣。因為已經去掉了部分維數(在課本例項中去掉了一維),所以在影象上顯示仍為一條直線。

#正交陣的逆等於其轉置。redei**ects為svd分解中的右奇異正交陣

reconmat =

(lowddatamat * redei**ects.t)

+ meanvals

return lowddatamat,reconmat

#測試以上**

datamat = loaddataset(r'選擇你自己的資料集路徑'

)lowdmat,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 =

'*',s=

90)

#利用pca對半導體製造資料降維

defreplacenanwithmean()

: datmat = loaddataset(

'secom.data',''

) numfeat = shape(datmat)[1

]for i in

range

(numfeat)

: meanval = mean(datmat[nonzero(

~isnan(datmat[

:,i]

.a))[0

],i]

) datmat[nonzero(isnan(datmat[

;,i]

.a))[0

],i]

= meanval

return datmat

datamat = replacenanwithmean(

)meanvals = mean(datamat,axis=0)

meanremoved = datamat - meanvals

covmat = cov(meanremoved,rowvar=0)

ei**als,ei**ects = linalg.eig(mat(covmat)

)ei**als

《機器學習實戰》原始碼解析(七) 回歸

標準回歸函式和資料匯入函式 from numpy import import matplotlib.pyplot as pltdef loaddataset filename 計算特徵值長度 numfeat len open filename readline split t 1datamat la...

《機器學習實戰》原始碼解析(五) 支援向量機

from numpy import smo演算法中的輔助函式 defloaddataset filename 功能 匯入資料庫 輸入 檔名 輸出 資料矩陣,標籤向量 datamat labelmat fr open filename for line in fr.readlines linearr ...

九jQuery原始碼解析之 each

jquery中存在兩個each方法都是用於遍歷的,乙個是對jquery物件集合使用.each 用於遍歷這個集合 each function index,element 還有乙個是擴充套件jquery的靜態.each 方法.從原始碼中可以看到,存在乙個呼叫,那麼我們就順藤摸瓜,直接尋找jquery.e...