机器学习之降维方法PCA与因子分析

上期内容:

机器学习之朴素贝叶斯模型

上期讲到朴素贝叶斯模型,它适合于数据量小,或者特征间相互独立,若遇到特征间的相关系数较大,我们可以对特征进行降维,减少特征数量。今天我们就来讲讲机器学习中的降维方法:主成分分析(PCA)和因子分析。文章重在python实现,不是数学推导。喜欢推到的同学可以参考

文章目录

  • 主成分分析(PCA)
    • 1、原理
    • 2、基本流程
    • 3、优缺点
    • 4、python实战
      • 利用python实现
      • 利用sklearn实现
  • 附加:因子分析

主成分分析(PCA)

1、原理

  • 主成分分析是一种常用的无监督学习方法,它利用正交变换将线性相关变量的观测数据转化为少数几个线性无关变量表示的数据,线性无关的变量叫做主成分。由于主成分比原数据个数少,因此被称为降维方法(减少维度)。
  • 主成分分析中,首先将数据进行规范化(符合正态分布)。之后对数据进行正交变量,减少变量个数,使其线性无关。新变量是可能的正交变换中变量的方差的和最大的,方差表示新变量上存储的信息大小,根据方差大小,将新变量依次成为第一主成分、第二主成分等。这就是PCA的基本思想。

2、基本流程

  • 去中心标准化
  • 计算数据的协方差矩阵(n*n)及矩阵的特征值与特征向量
  • 对特征值降序排序,保留最大的k个特征向量
  • 将数据转换到k个特征向量构建的新空间中

3、优缺点

  • 优点:
    • 使得数据集更易使用;
    • 降低算法的计算开销;
    • 去除噪声;
    • 使得结果容易理解;
    • 完全无参数限制。
  • 缺点:
    • 如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高;
    • 特征值分解有一些局限性,比如变换的矩阵必须是方阵;
    • 在非高斯分布(正态分布)情况下,PCA方法得出的主成分可能并不是最优的。

4、python实战

利用python实现

  • 为了更清楚明白PCA的详细过程,这里利用python语句进行一步一步的实现PCA
# 1、读取数据集
model_data = pd.read_csv("PCA数据集.csv",encoding='gbk',sep=',',index_col=0)
# 2、去中心标准化
model_data['X1'] = model_data['X1'] - model_data['X1'].mean()
model_data['X2'] = model_data['X2'] - model_data['X2'].mean()
model_data['X3'] = model_data['X3'] - model_data['X3'].mean()
model_data['X4'] = model_data['X4'] - model_data['X4'].mean()
model_data['X5'] = model_data['X5'] - model_data['X5'].mean()
# 3、计算协方差矩阵
mtr_ju = model_data.cov()
# 4、计算协方差矩阵的特征值和特征向量
import numpy as np
val, vec = np.linalg.eig(mtr_ju)
# 5、选择特征值最大的两个特征向量点积原数据 成为新特征  
np.dot(np.array(vec[:,0:2]), np.array(model_data))

机器学习之降维方法PCA与因子分析_第1张图片
机器学习之降维方法PCA与因子分析_第2张图片

利用sklearn实现

import pandas as pd
from sklearn.decomposition import PCA
from sklearn import preprocessing    # preprocessing预先处理

# 1、读取数据
data = pd.read_csv("PCA数据集.csv",encoding='gbk',sep=',',index_col=0)
# 2、查看相关系数矩阵,判定做变量降维的必要性(非必须)
corr_matrix = data.corr(method='pearson') # 结果存在0.8以上的相关系数
#对数据进行一个皮尔逊相关系数,为什么不用斯皮尔曼,因为主成分分析只能进行变量之间的线性关系的提取,不能进行非线性
# 3、做主成分之前,进行中心标准化
data = preprocessing.scale(data)#scale去中心标准化
# 4、使用sklearn的主成分分析,用于判断保留主成分的数量
'''说明:1、第一次的n_components参数应该设的大一点
   说明:2、观察explained_variance_ratio_和explained_variance_的取值变化,
   建议explained_variance_ratio_累积大于0.85,explained_variance_需要保留的最后一个主成分大于0.8,
'''
pca=PCA(n_components=2)  # n_components=2指定保留2个主成分  第一次可以设置大一点,查看各特征的方差,作比较
pca.fit(data)            # 对其进行主成分分析
newdata1=pca.fit_transform(data)
print(pca.explained_variance_)      # explained_variance_主成分的解释方差
print(pca.explained_variance_ratio_)# explained_variance_ratio_主成分的解释方差占比,需计算累计方差比
# 主成分选取原则:
# 1.主成分的解释方差>=1或者十分接近1;
# 2.累计方差占比(主成分累计的解释变异达到80%-90%)
pca=PCA(n_components=1).fit(data)    # 综上分析,选择1个主成分
newdata=pca.fit_transform(data)      # 获取数据的主成分
'''通过主成分在每个变量上的权重的绝对值大小,确定每个主成分的代表性'''
#主成分的计算(标准化后的数据*权重)
pca.components_

附加:因子分析

  • 因子分析和PCA的原理基本一致,都是适用于特征较多,相关性较大的数据集,降维分析方法。因子分析通过研究众多变量之间的内部依赖关系,用少数假想变量反映原来众多变量的主要信息。原始的变量是可观测的显在变量,而假想变量是不可观测的潜在变量,称为因子。(主成分分析中成为主成分)
  • 区别
    • 主成分分析中,新变量是原始变量的线性组合。在诸多主成分 中,第一个主成分在方差中的占比最大,说明它综合原有变量的能力最强,越往后主成分在方差中的比重也小,综合原信息的能力越弱。重点在于解释各变量的总方差。
    • 因子分析不是原有变量的线性组合,而是将变量进行分解,利用少数几个公共因子去解释较多个要观测变量中存在的复杂关系,而这些少数因子分解为公共因子与特殊因子两部分。公共因子是由所有变量共同具有的少数几个因子;特殊因子是每个原始变量独自具有的因子。重点放在解释各变量之间的协方差。

参考:
机器学习–主成分分析(PCA)算法的原理及优缺点
因子分析
因子分析与主成分分析的区别
统计学习方法 李航著

你可能感兴趣的:(机器学习,数据分析,scikit-learn,机器学习)