特征提取:
主成分分析(Principal Component Analysis)
许多变量之间可能存在相关性,从而增加了问题分析的复杂性,因此需要找到一个合理的方法,在减少需要分析的指标同时,尽量减少原指标包含信息的损失。
例如:样本中有n维特征,特征之间可能存在相关性。如何去掉冗余特征!
如线性代数的中的: 向量组是线性相关的,其中一些向量可由这个向量组的极大无关组线性表示。主成分分析就属于这类降维(特征压缩)的方法
图像展示
具体步骤:
-
找出第一个主成分的方向,也就是数据方差最大的方向。(特征值最大)
-
找出第二个主成分的方向,也就是数据方差次大的方向,并且该方向与第一个主成分方向正交(orthogonal 如果是二维空间就叫垂直)。(第二大特征值)
-
通过这种方式计算出所有的主成分方向。
-
通过数据集的协方差矩阵及其特征值分析,我们就可以得到这些主成分的值。
-
一旦得到了协方差矩阵的特征值和特征向量,我们就可以保留最大的 N 个特征。这些特征向量也给出了 N 个最重要特征的真实结构,我们就可以通过将数据乘上这 N 个特征向量 从而将它转换到新的空间上。
PCA的应用范围:
1:数据压缩
2:数据可视化 (高维将低纬)
3:机器学习处理数据
PCA 优缺点
优点:降低数据的复杂性,识别最重要的多个特征。
缺点:不一定需要,且可能损失有用信息。
适用数据类型:数值型数据
实例:
1: 人工制造一个3维数据集,降维到2维平面上。
import numpy as np
from sklearn.datasets import make_gaussian_quantiles
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 产生一个 3维数据集
x,y =make_gaussian_quantiles(n_samples=10,n_features=3,n_classes=3,random_state=None)
#原始数据可视化
ax.scatter(x[...,0],x[...,1],x[...,2],c=y)
def meanX(data):
return np.mean(data,axis=0) #按列求均值
def PCA(X,k):
"""
X : 原始数据
k : 降到k维
return : 降维的数据,和返回处理后的原始数据
"""
average =maenX(X) #1:求均值
m,n = np.shape(X)
data_adjust = []
avgs =np.tile(average,(m,1))
data_adjust = avgs-X # (X -maen)
covX = np.cov(data_adjust.T) #协方差 (X-maen)(X-maen).T
feature,featureVector =np.linalg.eig(covX) # 求特征值和特征向量
index = np.argsort(-feature) # 特征值按从大到小顺序排序 排序下标
finalData = []
if k>n :
print('k must lower than feature number')
return
else:
selectVec = np.matrix(featureVector.T[index[:k]]) # 特征向量
finalData = data_adjust*selectVec.T # 降维
reconData =(finalData *selectVec)+average # 还原数据
return finalData ,reconData
def plotData(data1):
dataArr1 = np.array(data1)
m = np.shape(dataArr1)[0]
axis_x1 = []
axis_y1 = []
for i in range(m):
axis_x1.append(dataArr1[i,0])
axis_y1.append(dataArr1[i,1])
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(axis_x1, axis_y1, s=50, c='red', marker='s')
plt.xlabel('x1'); plt.ylabel('x2');
plt.show()
x1,x2 =PCA(x,2)
plotData(x1)
2:IRIS数据集可视化
import pandas as pd
from sklearn.datasets import load_iris #导入IRIS数据集
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
iris = load_iris() #特征矩阵
data = iris.data
x = StandardScaler().fit_transform(data) # 标准化数据
target = iris.target # 标签
column_names =['sepal length', 'sepal width', 'petal length', 'petal width']
# 原始数据集 特征是4维不能可视化
df =pd.DataFrame(x)
df.columns =column_names
df['species'] =target
#pca 将数据降到3维,可视化
pca3 = PCA(n_components=3)
x_pca3 = pca3.fit_transform(x)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x_pca3[...,0],x_pca3[...,1],x_pca3[...,2],c=target)
ax.grid()
print('输出各个主成分所占比例')
print(pca3.explained_variance_ratio_)
#pca 处理后的数据集到2维,可以可视化
pca = PCA(n_components=2) # pca 降维到2维
x_pca= pca.fit_transform(x) #pca降维处理
print(pca.explained_variance_ratio_)
df_pca = pd.DataFrame(data=x_pca,columns=['primary component1','primary compoment2'])
df_pca['species'] =target
fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(1,1,1)
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component PCA', fontsize = 20)
targets = [0,1,2]
colors = ['r', 'g', 'b']
for label,color in zip(targets,colors):
indices = df_pca['species'] ==label
ax.scatter(df_pca.loc[indices,'primary component1'],df_pca.loc[indices,'primary compoment2'],c=color,s=60)
ax.legend(target)
ax.grid()
plt.show()
b站上浙江大学机器学习课程笔记:
Reference:
[1] https://zhuanlan.zhihu.com/p/55297233
[2] https://www.cnblogs.com/xingshansi/p/6445625.html
[3] https://blog.csdn.net/daaizjh/article/details/81065054
[4]https://www.bilibili.com/video/BV1dJ411B7ghfrom=search&seid=590519869570777855浙江大学-研究生机器学习课程