1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 数据降维之PCA(主成分分析)

数据降维之PCA(主成分分析)

时间:2020-12-26 05:05:54

相关推荐

数据降维之PCA(主成分分析)

本文代码及数据集来自《Python大数据分析与机器学习商业案例实战》

如果特征变量的数量非常多(如成百上千个特征变量),我们往往需要进行数据降维。降维的方法主要有选择特征和抽取特征两种:选择特征是从原有的特征中挑选出最佳的特征;抽取特征则是将数据由高维向低维投影,进行坐标的线性转换。PCA即为典型的抽取特征的方法,它不仅是对高维数据进行降维,更重要的是经过降维去除噪声,发现数据中的模式。

基本用法

# 三维空间降维Python代码实现import pandas as pdX = pd.DataFrame([[45, 0.8, 9120], [40, 0.12, 2600], [38, 0.09, 3042], [30, 0.04, 3300], [39, 0.21, 3500]], columns=['年龄(岁)', '负债比率', '月收入(元)'])print(X)

运行结果:

# 对3个维度的特征数据进行标准化from sklearn.preprocessing import StandardScalerX_new = StandardScaler().fit_transform(X)print(X_new)from sklearn.decomposition import PCApca = PCA(n_components=2) # 设置PCA模型的参数n_components为2,即将三维数据降为二维数据pca.fit(X_new) # 对标准化后的数据进行模型训练X_transformed = pca.transform(X_new) # 对标准化后的数据进行降维print(X_transformed)print(ponents_) # 获取线性组合系数

运行结果:

可以看到,ponents_是一个二维数组,第1个元素中的3个数对应的是下述公式中的系数a11、a12、a13,第2个元素中的3个数对应的是下述公式中的系数a21、a22、a23。

# 打印降维过程中原始特征的线性组合公式dim = ['年龄(岁)', '负债比率', '月收入(元)']for i in ponents_:formula = []for j in range(len(i)):formula.append(str(i[j]) + ' * ' + dim[j])print(" + ".join(formula))dim = ['X', 'Y', 'Z']index = 1for i in ponents_:formula = []for j in range(len(i)):formula.append(str(i[j]) + ' * ' + dim[j])print('F' + str(index) + ' = ' + " + ".join(formula))index += 1

运行结果:

案例实战:人脸识别模型

首先从照片数据集中导入需要识别的人脸照片,这里使用的数据集是纽约大学提供的公开人脸数据库Olivetti Faces。原图是一整张图片,含有40个人的脸部照片,每人10张。笔者将其拆分成400张jpg格式的图片,放在本案例代码所在的文件夹下的olivettifaces文件夹中,并按一定的规则对图片的文件名进行整理。以“10_0.jpg”为例,10代表编号为10的人的图片,“_”是第1部分和第3部分的分隔符,0代表这个人的10张图片中编号为0的那一张,“.jpg”为文件扩展名。

# 1.读取人脸照片数据import osnames = os.listdir('olivettifaces')print(names[0:5])

运行结果:[‘10_0.jpg’, ‘10_1.jpg’, ‘10_2.jpg’, ‘10_3.jpg’, ‘10_4.jpg’]

# 读取第一张图片from PIL import Imageimg0 = Image.open('olivettifaces\\' + names[0])#img0.show()# 2.人脸数据处理 - 特征变量提取import numpy as npimg0 = img0.convert('L') # 参数'L'指转换成灰度格式的图像img0 = img0.resize((32, 32)) # 调整图像尺寸为32×32像素arr = np.array(img0) # 将这1024个像素点的灰度值转换为一个二维数组import pandas as pdprint(pd.DataFrame(arr))

运行结果:

# 上面获得的32×32的二维数组还需要转换成1×1024格式才能用于数据建模arr = arr.reshape(1, -1)print(arr)# 将1×1024的二维数组降维成一维数组,并用tolist()函数将其转换为列表print(arr.flatten().tolist())

这样就完成了第1张图片的图像数据到数值类型数据的转换,为方便大家理解,可以将这个列表表达成下表的形式,第1张图片共有1024个特征变量,每个变量为不同像素点的灰度值。

将上述方法结合for循环,就可以将所有人脸图片的图像数据都转换成数值类型数据,从而构造相应的特征变量,代码如下。

X = []for i in names:img = Image.open('olivettifaces\\' + i)img = img.convert('L')img = img.resize((32, 32))arr = np.array(img)X.append(arr.reshape(1, -1).flatten().tolist()) # 将每张图片的灰度值添加到X列表中# 将其转换为DataFrame格式再进行查看import pandas as pdX = pd.DataFrame(X)print(X)# 查看这些数据的行列数print(X.shape)

运行结果:

首先来提取第1张人脸图片的目标变量。该图片的文件名为10_0.jpg,其中的10是该图片对应的人的编号,即我们所需要的目标变量。其中names[0]为第1张图片的文件名10_0.jpg,split()函数根据“_”号将文件名分割为2个部分,通过[0]提取第1部分,即人的编号10。split()函数分割字符串得到的仍是字符串,但是目标变量y需要为数字,所以需要用int()函数将字符串转换为数字。

print(int(names[0].split('_')[0]))

将上述方法结合for循环,便能提取400张人脸图片的目标变量了。

y = []for i in names:img = Image.open('olivettifaces\\' + i)y.append(int(i.split('_')[0]))print(y)

运行结果:

# 数据划分与降维# 1.划分训练集和测试集from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)# 2.PCA数据降维from sklearn.decomposition import PCApca = PCA(n_components=100)pca.fit(X_train)X_train_pca = pca.transform(X_train)X_test_pca = pca.transform(X_test)print(X_train_pca.shape) # 训练集为320行,100列print(X_test_pca.shape) # 测试集为80行,100列# pd.DataFrame(X_train_pca).head()# pd.DataFrame(X_test_pca).head()# 模型的搭建与使用# 1.模型搭建from sklearn.neighbors import KNeighborsClassifierknn = KNeighborsClassifier() # 建立KNN模型 knn.fit(X_train_pca, y_train) # 用降维后的训练集进行训练模型# 2.模型预测y_pred = knn.predict(X_test_pca) # 用降维后的测试集进行测试print(y_pred) # 将对测试集的预测结果打印出来import pandas as pda = pd.DataFrame() # 创建一个空DataFrame a['预测值'] = list(y_pred)a['实际值'] = list(y_test)a.head() # 查看表格前5行from sklearn.metrics import accuracy_scorescore = accuracy_score(y_pred, y_test)print(score)score = knn.score(X_test_pca, y_test)print(score)

运行结果:

# 模型对比(数据降维与不降维)from sklearn.neighbors import KNeighborsClassifierknn = KNeighborsClassifier() # 建立KNN模型 knn.fit(X_train, y_train) # 不使用数据降维,直接训练y_pred = knn.predict(X_test) # 不使用数据降维,直接测试from sklearn.metrics import accuracy_scorescore = accuracy_score(y_pred, y_test)print(score)

在本例中降维的模型与不降维的模型得分差不多。本案例的数据量并不大,当数据量更大时,利用PCA进行数据降维会发挥更大的作用。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。