import os all_folds = os.listdir(r'C:\Users\Administrator\Desktop\源数据-分析\lfw_funneled') all_folds = [x for x in all_folds if'.'notin x] import pandas as pd numbers_img=pd.DataFrame(columns=["文件名称","图片数量"])####统计各个文件夹里面的图片数量 for i inrange(len(all_folds)): path = 'C:\\Users\\Administrator\\Desktop\\源数据-分析\\lfw_funneled\\'+all_folds[i] all_files = os.listdir(path) numbers_img.loc[i]=[all_folds[i],len(all_files)] img_10=numbers_img[numbers_img["图片数量"]==10].reset_index()#####为了降低数据偏斜,选取图片数量为10的文件(否则,特征提取会被图片数量过多的数据影响) from PIL import Image import numpy as np image_arr_list=[]###存放灰度值numpy数组 flat_arr_list=[]###存放灰度值一维数组 target_list=[]###存放目标值 for m inrange(len(img_10["文件名称"])): file_address='C:\\Users\\Administrator\\Desktop\\源数据-分析\\lfw_funneled\\'+img_10["文件名称"][m]+"\\"####指定特定的文件地址 image_name=os.listdir(file_address)###获得指定文件夹下的左右文件名称 for n in image_name: image=Image.open(file_address+n) image=image.convert('L')###RGB(红绿蓝)像素值转换成灰度值 image_arr=np.array(image,"f")###灰度值转化成numpy数组(二维) flat_arr=image_arr.ravel()###将数组扁平化处理,返回的是一个一维数组的非副本视图,就是将几行的数据强行拉成一行 image_arr_list.append(image_arr) flat_arr_list.append(flat_arr) target_list.append(m)###这里的m设定是数字,如果是文本的话后面的算法会报错 faces_dict={"images":np.array(image_arr_list),"data":np.array(flat_arr_list),"target":np.array(target_list)}
3.划分数据集并进行建模
下面我们划分数据集,并利用NMF,PCA和K均值来依次进行建模,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12
from sklearn.model_selection import train_test_split train=faces_dict["data"]/255 X_train,X_test,y_train,y_test=train_test_split(train,faces_dict["target"],random_state=0)###划分训练集和测试集 from sklearn.decomposition import PCA from sklearn.cluster import KMeans from sklearn.decomposition import NMF nmf=NMF(n_components=100,random_state=0) nmf.fit(X_train) pca=PCA(n_components=100,random_state=0) pca.fit(X_train) kmeans=KMeans(n_clusters=100,random_state=0) kmeans.fit(X_train)###注意这是训练数据
list=[X_test,X_reconstructed_nmf,X_reconstructed_kmeans,X_reconstructed_pca] X_reconstructed=[[],[],[],[]] shape=image_arr.shape###获得二维数组的维度 for i inrange(len(list)): for m inlist[i]: vector=np.matrix(m)####将一维数组转换成矩阵 arr2=np.asarray(vector).reshape(shape)###可以通过这个矩阵将一维数组转换为原灰度值numpy数组,即arr2=image_arr X_reconstructed[i].append(arr2)
接下来,为了比较方便,我们只选取前5张图像,并利用多图表结构将其展现出来
1 2 3 4 5 6 7 8 9 10 11 12 13
import seaborn as sns plt.style.use("fivethirtyeight") sns.set_style({'font.sans-serif':['SimHei','Arial']}) fig,axes=plt.subplots(4,5,figsize=(45, 30)) plt.suptitle('K均值,PCA与NMF的图像还原比较', fontsize=80, ha='center') for l inrange(len(X_reconstructed)): for n inrange(5): axes[l,n].imshow(X_reconstructed[l][n],cmap="gray")###通过灰度值还原图像 axes[0,0].set_ylabel("原始图片",fontsize=50) axes[1,0].set_ylabel("NMF",fontsize=50) axes[2,0].set_ylabel("K均值",fontsize=50) axes[3,0].set_ylabel("PCA",fontsize=50) plt.show()###由于之前已经划分了数据集,这是利用训练出来的模型对测试数据集进行的图像恢复,所以只有38个图像,而不是原来的150个图像
import os all_folds = os.listdir(r'C:\Users\Administrator\Desktop\源数据-分析\lfw_funneled') all_folds = [x for x in all_folds if'.'notin x] import pandas as pd numbers_img=pd.DataFrame(columns=["文件名称","图片数量"])####统计各个文件夹里面的图片数量 for i inrange(len(all_folds)): path = 'C:\\Users\\Administrator\\Desktop\\源数据-分析\\lfw_funneled\\'+all_folds[i] all_files = os.listdir(path) numbers_img.loc[i]=[all_folds[i],len(all_files)] img_10=numbers_img[numbers_img["图片数量"]==10].reset_index()#####为了降低数据偏斜,选取图片数量为10的文件(否则,特征提取会被图片数量过多的数据影响) from PIL import Image import numpy as np image_arr_list=[]###存放灰度值numpy数组 flat_arr_list=[]###存放灰度值一维数组 target_list=[]###存放目标值 for m inrange(len(img_10["文件名称"])): file_address='C:\\Users\\Administrator\\Desktop\\源数据-分析\\lfw_funneled\\'+img_10["文件名称"][m]+"\\"####指定特定的文件地址 image_name=os.listdir(file_address)###获得指定文件夹下的左右文件名称 for n in image_name: image=Image.open(file_address+n) image=image.convert('L')###RGB(红绿蓝)像素值转换成灰度值 image_arr=np.array(image,"f")###灰度值转化成numpy数组(二维) flat_arr=image_arr.ravel()###将数组扁平化处理,返回的是一个一维数组的非副本视图,就是将几行的数据强行拉成一行 image_arr_list.append(image_arr) flat_arr_list.append(flat_arr) target_list.append(m)###这里的m设定是数字,如果是文本的话后面的算法会报错 faces_dict={"images":np.array(image_arr_list),"data":np.array(flat_arr_list),"target":np.array(target_list)}
3.划分数据集并进行建模
下面我们划分数据集,并利用NMF,PCA和K均值来依次进行建模,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12
from sklearn.model_selection import train_test_split train=faces_dict["data"]/255 X_train,X_test,y_train,y_test=train_test_split(train,faces_dict["target"],random_state=0)###划分训练集和测试集 from sklearn.decomposition import PCA from sklearn.cluster import KMeans from sklearn.decomposition import NMF nmf=NMF(n_components=100,random_state=0) nmf.fit(X_train) pca=PCA(n_components=100,random_state=0) pca.fit(X_train) kmeans=KMeans(n_clusters=100,random_state=0) kmeans.fit(X_train)###注意这是训练数据
list=[X_test,X_reconstructed_nmf,X_reconstructed_kmeans,X_reconstructed_pca] X_reconstructed=[[],[],[],[]] shape=image_arr.shape###获得二维数组的维度 for i inrange(len(list)): for m inlist[i]: vector=np.matrix(m)####将一维数组转换成矩阵 arr2=np.asarray(vector).reshape(shape)###可以通过这个矩阵将一维数组转换为原灰度值numpy数组,即arr2=image_arr X_reconstructed[i].append(arr2)
接下来,为了比较方便,我们只选取前5张图像,并利用多图表结构将其展现出来
1 2 3 4 5 6 7 8 9 10 11 12 13
import seaborn as sns plt.style.use("fivethirtyeight") sns.set_style({'font.sans-serif':['SimHei','Arial']}) fig,axes=plt.subplots(4,5,figsize=(45, 30)) plt.suptitle('K均值,PCA与NMF的图像还原比较', fontsize=80, ha='center') for l inrange(len(X_reconstructed)): for n inrange(5): axes[l,n].imshow(X_reconstructed[l][n],cmap="gray")###通过灰度值还原图像 axes[0,0].set_ylabel("原始图片",fontsize=50) axes[1,0].set_ylabel("NMF",fontsize=50) axes[2,0].set_ylabel("K均值",fontsize=50) axes[3,0].set_ylabel("PCA",fontsize=50) plt.show()###由于之前已经划分了数据集,这是利用训练出来的模型对测试数据集进行的图像恢复,所以只有38个图像,而不是原来的150个图像