日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

机器学习系列(14)_PCA对图像数据集的降维_03

發布時間:2023/12/29 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习系列(14)_PCA对图像数据集的降维_03 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、噪音過濾
    • 1、案例:手寫圖像識別加噪與降噪
    • 2、案例:手寫圖像識別尋找最佳維度
    • 3、模擬PCA過程
    • 4、模擬SVD過程

一、噪音過濾

降維的目的之一是希望拋棄對模型帶來負面影響的特征,同時,帶有效信息的特征的方差應該是遠大于噪音的,所以相比噪音,有效的特征所帶來的信息不會在PCA當中大量拋棄。inverse_transform能夠在不恢復原始數據的情況下,將降維后的數據返回到原本的高維空間。(即能夠實現:“保證維度,但是去除方差很小的特征所帶來的信息”)。我們可以利用·inverse_transform來實現噪音的過濾。

尋找確定關鍵特征是降噪的前提,只保留關鍵特征,其他都可以看做是噪音。

  • 重要參數:n_components,svd_solver,random_state

  • 三個重要屬性:components_,explained_variance_以及explained_variance_ratio_

  • 接口:fit,transform,fit_transform以及inverse_transform

1、案例:手寫圖像識別加噪與降噪

# 1. 導入所需要的庫和模塊 from sklearn.datasets import load_digits from sklearn.decomposition import PCA import matplotlib.pyplot as plt import numpy as np # 2. 導入數據,探索數據 digits = load_digits() digits.data.shape

set(digits.target.tolist())

# 3. 定義畫圖函數 def plot_digits(data): fig, axes = plt.subplots(4,10,figsize=(10,4),subplot_kw = {"xticks":[],"yticks":[]})for i, ax in enumerate(axes.flat):ax.imshow(data[i].reshape(8,8),cmap="binary")plot_digits(digits.data)

# 4. 為數據加上噪音 np.random.RandomState(42)noisy = np.random.normal(digits.data,2) plot_digits(noisy)

為手寫數據加上噪音之后的圖片:

# 5. PCA降維 pca = PCA(0.5).fit(noisy) #改變參數 X_dr = pca.transform(noisy) X_dr.shape

# 6. 逆轉降維結果,實現降噪 without_noise = pca.inverse_transform(X_dr) plot_digits(without_noise) plt.show()

使用inverse_transform降噪后:

原來沒有噪聲的時候的維度:

without_noise.shape

2、案例:手寫圖像識別尋找最佳維度

# 1. 導入需要的模塊和庫 from sklearn.decomposition import PCA from sklearn.ensemble import RandomForestClassifier as RFC from sklearn.model_selection import cross_val_score import matplotlib.pyplot as plt import pandas as pd import numpy as np # 2. 導入數據,探索數據 data = pd.read_csv(r"digit recognizor.csv") X = data.iloc[:,1:] y = data.iloc[:,0] X.shape

# 3. 畫累計方差貢獻率曲線,找最佳降維后維度的范圍 pca_line = PCA().fit(X) #PCA,不填n_components,使用X.shape中的最小值 plt.figure(figsize=[20,5]) plt.plot(np.cumsum(pca_line.explained_variance_ratio_)) plt.xlabel("number of components after dimension reduction") #降維后的特征書目 plt.ylabel("cumulative explained variance ratio") #累計可解釋性方差累計曲線 plt.show() #0-200之間

# 4. 降維后維度的學習曲線,繼續縮小最佳維度的范圍 score = [] for i in range(1,101,10): #取得0-100,用隨機森林來跑X_dr = PCA(i).fit_transform(X)once = cross_val_score(RFC(n_estimators=10,random_state=0) #默認為10,保持穩定。,X_dr,y,cv=5).mean() #5次交叉驗證的值,取平均值score.append(once) plt.figure(figsize=[20,5]) plt.plot(range(1,101,10),score) plt.show()

# 5. 細化學習曲線,找出降維后的最佳維度 score = [] for i in range(10,25): #再截取X_dr = PCA(i).fit_transform(X)once = cross_val_score(RFC(n_estimators=10,random_state=0),X_dr,y,cv=5).mean()score.append(once) plt.figure(figsize=[20,5]) plt.plot(range(10,25),score) plt.show() # 6. 導入找出的最佳維度進行降維,查看模型效果 X_dr = PCA(21).fit_transform(X) #取23、21cross_val_score(RFC(n_estimators=100,random_state=0),X_dr,y,cv=5).mean()

# 7. 更換模型 from sklearn.neighbors import KNeighborsClassifier as KNN cross_val_score(KNN(),X_dr,y,cv=5).mean()

# 8. KNN的k值學習曲線 score = [] for i in range(10):X_dr = PCA(23).fit_transform(X)once = cross_val_score(KNN(i+1),X_dr,y,cv=5).mean()score.append(once) plt.figure(figsize=[20,5]) plt.plot(range(10),score) plt.show()

# 9. 定下超參數后,模型效果如何,模型運行時間如何? cross_val_score(KNN(4),X_dr,y,cv=5).mean()

3、模擬PCA過程

##自適應求K值 import numpy as np import cv2 as cv# 數據中心化 def Z_centered(dataMat):rows, cols = dataMat.shapemeanVal = np.mean(dataMat, axis=0) # 按列求均值,即求各個特征的均值meanVal = np.tile(meanVal, (rows, 1))newdata = dataMat - meanValreturn newdata, meanVal# 最小化降維造成的損失,確定k def Percentage2n(eigVals, percentage):sortArray = np.sort(eigVals) # 升序sortArray = sortArray[-1::-1] # 逆轉,即降序arraySum = sum(sortArray)tmpSum = 0num = 0for i in sortArray:tmpSum += inum += 1if tmpSum >= arraySum * percentage:return num# 得到最大的k個特征值和特征向量 def EigDV(covMat, p):D, V = np.linalg.eig(covMat) # 得到特征值和特征向量k = Percentage2n(D, p) # 確定k值print("保留99%信息,降維后的特征個數:" + str(k) + "\n")eigenvalue = np.argsort(D)K_eigenValue = eigenvalue[-1:-(k + 1):-1]K_eigenVector = V[:, K_eigenValue]return K_eigenValue, K_eigenVector# 得到降維后的數據 def getlowDataMat(DataMat, K_eigenVector):return DataMat * K_eigenVector# 重構數據 def Reconstruction(lowDataMat, K_eigenVector, meanVal):reconDataMat = lowDataMat * K_eigenVector.T + meanValreturn reconDataMat# PCA算法 def PCA(data, p):dataMat = np.float32(np.mat(data))# 數據中心化dataMat, meanVal = Z_centered(dataMat)# 計算協方差矩陣# covMat = Cov(dataMat)covMat = np.cov(dataMat, rowvar=0)# 得到最大的k個特征值和特征向量D, V = EigDV(covMat, p)# 得到降維后的數據lowDataMat = getlowDataMat(dataMat, V)# 重構數據reconDataMat = Reconstruction(lowDataMat, V, meanVal)return reconDataMatdef main():imagePath = '96014.jpg'image = cv.imread(imagePath)image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)rows, cols = image.shapeprint("降維前的特征個數:" + str(cols) + "\n")print(image)print('----------------------------------------')reconImage = PCA(image, 0.6) # 通過改變保留信息的程度來看這個圖片的特征值 reconImage = reconImage.astype(np.uint8)print(reconImage)cv.imshow('test', reconImage)cv.waitKey(0)cv.destroyAllWindows()if __name__ == '__main__':main()

4、模擬SVD過程

def svd(img, topk_percent=0.1):"""使用svd對圖片降維,可作為一種數據增強手段每列作為一個向量,先構建方陣,再求特征值 特征向量,取前N個主成分,再重構圖像:param img: 輸入圖像:param topk_percent: 圖像恢復率,:return: img after svd"""img_src = img[...] #img要三維的?if len(img.shape) == 3:img_src = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)h, w = img_src.shapedata = np.asarray(img_src, np.double)# 以下兩種方式都可以# method 1U, s, V = np.linalg.svd(data)K = round(len(s) * topk_percent)S = np.diag(s)major_data = np.dot(U[:, :K], np.dot(S[:K, :K], V[:K, :]))# # method 2# feat_values, feat_vectors = np.linalg.eig(np.dot(data.T, data))# feat_index = np.argsort(np.sqrt(feat_values), axis=0)[::-1]# S = np.diag(feat_values)# V = feat_vectors[:, feat_index]# S_inv = np.asmatrix(S).I# V_inv = np.asmatrix(V).I# U = np.dot(np.dot(data, V), S_inv)# K = round(S.shape[0] * topk_percent)# major_data = np.dot(np.dot(U[:, :K], S[:K, :K]), V_inv[:K, :])rebuild_img = np.asarray(major_data, np.uint8)cv2.imshow('1', rebuild_img)cv2.waitKey(0)return rebuild_imgdef pca(img, topk_percent=0.1):"""使用pca對圖片降維,可作為一種數據增強手段每列作為一個向量,先0均值化,再求協方差矩陣的特征值和特征向量,取前N個主成分,再重構圖像:param img: 輸入圖像:param topk_percent: 圖像恢復率,:return: img after pca"""img_src = img[...]if len(img.shape) == 3:img_src = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)print(img_src.shape)h, w = img_src.shapedata = np.asarray(img_src, np.double)# 計算每列的mean_mean = np.mean(data, axis=0)data -= _mean# 以 列為變量計算方式,計算協方差矩陣data_cov = np.cov(data, rowvar=False)feat_values, feat_vectors = np.linalg.eig(data_cov)feat_index = np.argsort(np.sqrt(feat_values), axis=0)[::-1]V = feat_vectors[:, feat_index]K = round(len(feat_values) * topk_percent)# 重建圖像major_data = np.dot(np.dot(data, V[:, :K]), V[:, :K].T) + _meanrebuild_img = np.asarray(major_data, np.uint8)cv2.imshow('0', rebuild_img) #參數錯誤1應該為0cv2.waitKey(0)return rebuild_img

總結

以上是生活随笔為你收集整理的机器学习系列(14)_PCA对图像数据集的降维_03的全部內容,希望文章能夠幫你解決所遇到的問題。

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