PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。
降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。
降维具有如下一些优点:
使得数据集更易使用。
降低算法的计算开销。
去除噪声。
使得结果容易理解。
思考:我们如何得到这些包含最大差异性的主成分方向呢?
答案:事实上,通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。
由于得到协方差矩阵的特征值特征向量有两种方法:特征值分解协方差矩阵、奇异值分解协方差矩阵,所以PCA算法有两种实现方法:基于特征值分解协方差矩阵实现PCA算法、基于SVD分解协方差矩阵实现PCA算法。
支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。
SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。
对于输入空间中的非线性分类问题,可以通过非线性变换将它转化为某个维特征空间中的线性分类问题,在高维特征空间中学习线性支持向量机。由于在线性支持向量机学习的对偶问题里,目标函数和分类决策函数都只涉及实例和实例之间的内积,所以不需要显式地指定非线性变换,而是用核函数替换当中的内积。核函数表示,通过一个非线性转换后的两个实例间的内积。
import sklearn.datasets as sd
import sklearn.decomposition as dc
import sklearn.model_selection as ms
import sklearn.svm as svm
import sklearn.metrics as sm
import matplotlib.pyplot as mp
faces = sd.fetch_olivetti_faces()
x, y = faces.data , faces.target
#print(x.shape,x.dtype,y.shape,set(y))
model = dc.PCA(n_components=140)
pca_x = model.fit_transform(x)
#print(x.shape,pca_x.shape)
train_x,test_x,train_y,test_y = ms.train_test_split(pca_x,y,test_size=0.2,random_state=7)
model = svm.SVC(class_weight='balanced')
model.fit(train_x,train_y)
pred_test_y = model.predict(test_x)
cm = sm.confusion_matrix(test_y,pred_test_y)
cr = sm.classification_report(test_y,pred_test_y)
n=0
for i in range(len(test_y)):
if pred_test_y[i]==test_y[i]:
n+=1
print("识别的准确率:",n/len(test_y),"%")
print(cr)
mp.figure('Confusion_matrix',facecolor='black')
mp.title('Confusion_matrix',fontsize=20)
mp.xlabel('Predicted',fontsize=14)
mp.ylabel('TrueClass',fontsize=14)
mp.tick_params(labelsize=10)
mp.imshow(cm ,interpolation= 'nearest',cmap='gray')
mp.show()
import sklearn.datasets as sd
import sklearn.decomposition as dc
import matplotlib.pyplot as mp
faces = sd.fetch_olivetti_faces()
x, y = faces.data, faces.target
print(x.shape,x.dtype,y.shape,set(y))
ncps = range(10,405,5)
evrs = []
for ncp in ncps:
model = dc.PCA(n_components=ncp)
model.fit_transform(x)
evr = model.explained_variance_ratio_.sum() #还原率误差
evrs.append(evr)
mp.figure('explained_variance_ratio',facecolor='white')
mp.title('explained_variance_ratio',fontsize=20)
mp.xlabel('n_components',fontsize=14)
mp.ylabel('explained_variance_ratio',fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
mp.plot(ncps,evrs,c='dodgerblue',label='explained_variance_ratio')
mp.legend()
mp.show()