0、前言:本文内容是机器学习算法回归预测的应用,其中数据集主要来自sklearn库自带的人脸数据,目的是通过KNN回归、线性回归、岭回归算法通过人物的左半张脸预测人物的右半张脸。
- 意义1:通过该项目掌握图片数据在机器学习当中的处理方法
- 意义2:通过该项目可以掌握多个机器学习算法模型对比实验的应用方法
1、原始数据获取:
-
0、数据准备(这一步的目的是直接将数据保存在本地,后面调用的时候如果本地有就不会下载了,因为下载有时候会因为网络问题报错)
链接:https://pan.baidu.com/s/1c1ZlwCUF_eEzTl4vDOXstA
提取码:1234 -
1、数据下载
# 导入机器学习三剑客
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 导入数据集
from sklearn.datasets import fetch_olivetti_faces
# fetch_olivetti_faces()函数首先会去用户根目录找,如果找不到,就会去下载,这个函数不光加载数据,也会将数据进行整合处理
# 但是国内经常下载失败,解决方案就是有下载好的文件,放到对应路径(C:\Users\“你的用户名”)向下。
faces = fetch_olivetti_faces()
display(faces['data'].shape,faces['images'].shape,faces['target'].shape)
'''
(400, 4096)
(400, 64, 64)
(400,)
'''
-
2、数据概览:数据导入后其实是一个字典,其中data键对应的值是人脸图片的二维数据,images对应的数据是人脸图片的三维数据,target代表图片属于第几个人(用来识别人物的),一共有400个人物。
- data数据
- data数据
-
3、数据处理
# 显示一张图片
data = faces['data']
# 通过data显示图片
plt.imshow(data[0].reshape(64,-1),cmap='gray') # cmap='gray' 是一个用于指定色彩映射(colormap)的关键字参数
# 通过images显示图片
images = faces['images']
plt.imshow(images[1],cmap='gray')
2、根据左边人脸补全右边人脸:
- 首先把左边人脸数据和右边人脸数据分开,然后左边人脸作为输入数据,右边人脸作为输出数据(预测数据)
- 理解图片数据:如果图片数据构成了一个二维数据,如下图,构成其每个像素点的数据组成了二维数组被存在在了images中
- 将数据拆分为为输入数据和输出数据
# 左半张人脸数据集
l_face = []
for i in range(400):
a = data[0].reshape(64,64)
l_face.append(a[:,:33].reshape(-1))
# plt.imshow(l_face[0].reshape(64,-1),cmap='gray') # 验证数据采集结果
# 右半张人脸数据集
r_face = []
for i in range(400):
a = data[i].reshape(64,64)
r_face.append(a[:,33:].reshape(-1))
# plt.imshow(r_face[0].reshape(64,-1),cmap='gray') # 验证数据采集结果
# 左边作为输入,右边作为输出
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(l_face,r_face,test_size=0.1)
- 数据预测
# 导入KNN,线性回归,岭回归,获得每一种模型对应的预测值
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import LinearRegression,Ridge
pred_dict = {}
model = {
'knn':KNeighborsRegressor(),
'line':LinearRegression(),
'Ridge':Ridge()
}
for key,val in model.items():
m = val.fit(x_train,y_train)
y_pred = m.predict(x_test)
pred_dict[key] = y_pred
- 获得y_pred
- 画图
# 获得了所有模型的预测数据y_pred,下一步画图
# 画图要求:一行表示一个人,分别是真实图片,Ridge预测图、Linear regression预测图、K-nn预测图
# 画布设计为5行4列
plt.figure(figsize=(4*2,5*2))
for i in range(5):
# 获得测试数据中第i个人真实人脸左半部分
l_tface = x_test[i]
# 获得测试数据中第i个人真实人脸右半部分
r_tface = y_test[i]
# 合并
# np.concatenate((array1, array2,..), axis=1)是使用numpy库的concatenate函数将多个数组沿着指定的轴(axis)拼接,axis等于0是上下拼接,等于1是左右拼接。
rall_face = np.concatenate((l_tface.reshape(64,-1),r_tface.reshape(64,-1)),axis=1)
# plt.imshow(rall_face,cmap='gray') # 验证组合成功
# 画每行第一个图
displt = plt.subplot(5,4,i*4+1)
displt.imshow(rall_face,cmap='gray')
displt.axis('off')
if i == 0:
displt.set_title('real_image')
for j,key in enumerate(pred_dict):
# 获取三个模型预测结果的组合
M_r_face = pred_dict[key][i].reshape(64,-1)
M_all_face = np.concatenate((l_tface.reshape(64,-1),M_r_face),axis=1)
# plt.imshow(M_all_face,cmap='gray') # 验证
# 画一层的图像
displt = plt.subplot(5,4,i*4+j+2)
displt.imshow(M_all_face,cmap='gray')
displt.axis('off')
if i == 0:
displt.set_title(f'{key}_image')
- 结果展示
3、总结:
- 在处理图片时会遇到数组的拆分与合并,一般数组拆分只需要将数组切片即可,数组合并有时候需要合并列,有时候需要合并行,这就要用到一个非常关键的numpy里面的方法concatenate()。这个方法使用介绍如下:
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# 沿着第二个维度(即轴=1)将两个数组堆叠在一起
result = np.concatenate((a, b), axis=1)
print(result)
'''
[[1 2 5 6]
[3 4 7 8]]
'''
# 沿着第二个维度(即轴=1)将两个数组堆叠在一起
result = np.concatenate((a, b), axis=0)
print(result)
'''
[[1 2]
[3 4]
[5 6]
[7 8]]
'''