使用python的numpy庫實現PCA演算法

2021-06-19 18:20:09 字數 1693 閱讀 8391

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from numpy import *

#引數1:特徵值向量,

#引數2:比率

#返回值:k(符合指定比率的topk k值)

def setk(eigvals,rate = 0.9):

eigvalind = argsort(eigvals) #對特徵值進行排序

for i in range(1,eigvals.size+1):

topk = eigvalind[:-(i + 1):-1]

eigval = eigvals[:, topk]

a = eigval.sum()

b = eigvals.sum()

print a/b

if a/b >= rate:

break;

return i

#功能:給定乙個矩陣,返回 經pca演算法降過維的 矩陣(降維的程度由rate決定)

# 如果要指定k,可直接修改這條語句「 k = setk(eigvals,rate)」

#引數1:矩陣

#引數2:要取特徵值的比率(rate = sum(topk特徵值)/sum(特徵值總和))

#返回值:經pca演算法降過維的 矩陣

def pca(datamat, rate=0.9):

meanvals = mean(datamat, axis=0)

meanremoved = datamat - meanvals #減去均值

stded = meanremoved / std(datamat) #用標準差歸一化

covmat = cov(stded, rowvar=0) #求協方差方陣

eigvals, eigvects = linalg.eig(mat(covmat)) #求特徵值和特徵向量

k = setk(eigvals,rate) #get the topnfeat

eigvalind = argsort(eigvals) #對特徵值進行排序

eigvalind = eigvalind[:-(k + 1):-1] #get topnfeat

redeigvects = eigvects[:, eigvalind] # 除去不需要的特徵向量

lowddatamat = stded * redeigvects #求新的資料矩陣

#reconmat = (lowddatamat * redeigvects.t) * std(datamat) + meanvals #對矩陣還原

return lowddatamat

a = array([[2.5,2.4],[0.5,0.7],[2.2,2.9],[1.9,2.2],[3.1,3.0],[2.3,2.7],[2,1.6],[1,1.1],[1.5,1.6],[1.1,0.9]])

print "a:"

print a

print pca(a,0.9)

#eigvals = array([3.735,1.133,0.457,0.323,0.199,0.153])

#print setk(eigvals,0.6)

投影:某一點在某個向量上的投影等於 這點的座標 點乘 向量的單位向量。

方陣的特徵值和特徵向量:

協方差:

python庫numpy的使用

python在構造機器學習應用程式時,numpy作為乙個重要的函式庫會被經常使用,裡面有便捷的向量和矩陣的計算函式 from numpy import 構造4 4的隨機矩陣 matrix mat random.rand 4,4 矩陣逆矩陣 invmat matrix.i 單位矩陣 matrix ma...

python的numpy庫結構 Numpy庫簡介

今天給大家分享乙個資料分析處理資料的常見的庫 numpy。這個庫是 python 資料分析的基礎,它提供的資料結構比 python 自身的更高效。我們知道 python 有自帶的列表資料結構。numpy 庫和 list 列表有什麼區別呢?python list 列表儲存的是物件的指標,比如 0,1,...

Python入門筆記(numpy庫的使用)

import numpy 讀取資料都為矩陣格式 numpy讀取檔案 test numpy.genfromtxt text2.txt delimiter dtype str,skip header 1 讀取並跳過第一行 print type test print test print help num...