[无监督学习] PCA降维

无监督学习:通过无标签的数据,学习数据的分布或数据与数据之间的关系。

1. 降维算法

1 定义:用低维的概念去类比高维的概念.将高维的图形转化为低维的图形的方法。
1.1. 算法模块 :PCA算法、NMF(非负矩阵分解)算法、LDA算法等。
1.2. Python库 :sklearn.decomposution;

2. 主成分分析( PCA )降维算法

1 主成分分析:主成分分析( Principal Component Analysis, PCA )是最常用的一种降维方法,通常用于高维数据集的探索与
可视化,还可以用作数据压缩和预处理等。PCA可以把具有相关性的高维变量合成为线性无关的低维变量,称为主成分。主成分能够尽可能保留原始数据的信息。

2 主成分分析步骤
2.1 对原始数据标准化
2.2 计算相关系数
2.3 计算特征
2.4 确定主成分
2.5 合成主成分

3 相关数学术语
3.1 方差
3.2 协方差
3.3 协方差矩阵
3.4 特征向量和特征值

4 主成分分析的主要作用
4.1 主成分分析能降低所研究的数据空间的维数。
4.2 多维数据的一种图形表示方法。
4.3 由主成分分析法构造回归模型,可以把各主成分作为新自变量代替原来自变量x做回归分析。
4.4 有时可通过因子负荷Aij的结论,弄清各变量之间的某些关系。

3. 算法案例

方差:各个样本和样本均值的差的平方和的均值,用来度量一-组数据的分散程度。
在这里插入图片描述
协方差:用于度量两个变量之间的线性相关性程度,若两个变量的协方差为0,则可认为二者线性无关。协方差矩阵则是由变量的协方差值构成的矩阵(对称阵)。
在这里插入图片描述
特征向量:矩阵的特征向量是描述数据集结构的非零向量
并满足如下公式:
在这里插入图片描述
其中:A是方阵,v是特征向量,λ是特征值。
1 原理
矩阵的主成分就是其协方差矩阵对应的特征向量,按照对应的特征值大小进行排序,最大的特征值就是第一主成分,其次是第二主成分,以此类推。

2 主成分分析-算法过程
在这里插入图片描述
3 Python算法实现
3.1. K-Means 模块的导入

#加载matplotlib用于数据的可视化
import matplotlib.pyplot as plt
#加载PCA算法包
from sklearn.decomposition import PCA

在sklearn库中,可以使用 sklearn.decomposition.PCA 加载PCA进行降维,主要参数有:

  1. n_components:指定主成分的个数,即降维后数据的维度。
  2. svd_solver:设置特征值分解的方法,默认为‘auto’,其
    他可选有‘full’, “arpack’, ‘randomized’。

3.2.数据的导入
Python中鸢尾花数据的导入

#加载鸢尾花数据集导入函数
from sklearn.datasets import load_iris

鸢尾花数据的部分展示:
在这里插入图片描述
3.3. 实例程序编写

目标:实现高维数据可视化,已知鸢尾花数据是4维的,共三类样本。使用PCA实现对鸢尾花数据进行降维,实现在二维平面上的可视化。

Step 1 :加载数据并进行降维

#加载数据并进行降维
data = load_iris()  #以字典的形式加载鸢尾花数据集
y = data.target  #使用y表示数据集中的标签(类别)
x = data.data  #使用x表示数据集中的属性数据
pca = PCA(n_components= 2)  #设置降维后的主成分数目为2
reduced_x = pca.fit_transform(x)  #对原始数据进行降维,并保存在reduced_x中

Step 2 :按类别对降维后的数据进行保存

#按类别对降维后的数据进行保存
red_x, red_y = [], [] #第一类数据点
blue_x, blue_y = [], [] #第二类数据点
green_x, green_y = [], [] #第三类数据点
def get_data(reduced_x, y):
    '''
    1.按照鸢尾花的类别将降维后的数据点保存在不同的列表中
    '''
    for i in range(len(reduced_x)):
       if y[i] == 0:
           red_x.append(reduced_x[i][0])
           red_y.append(reduced_x[i][1])
       elif y[i] == 1:
           blue_x.append(reduced_x[i][0])
           blue_y.append(reduced_x[i][1])
       else:
           green_x.append(reduced_x[i][0])
           green_y.append(reduced_x[i][1])

Step 3 :降维后数据点的可视化

#对数据点的可视化
fig = plt.figure()
ax = fig.add_subplot()
plt.scatter(red_x, red_y, c='r', marker= 'x')
plt.scatter(blue_x, blue_y, c='b', marker= 'D')
plt.scatter(green_x, green_y, c='g', marker= '.')
plt.show()

Step 4 :结果展示
在这里插入图片描述
可以看出,降维后的数据仍能够清晰地分成三类。这样不仅能削减数据的维度,降低分类任务的工作量,还能保证分类的质量。

Step 5 :完整程序模块

# -*- coding: utf-8 -*-
# @Time    : 2020/3/29 18:55
# @Author  : Zudy
# @FileName: course2_1.py

'''
1.用鸢尾花的数据集进行降维处理(PCA'''

#加载matplotlib用于数据的可视化
import matplotlib.pyplot as plt
#加载PCA算法包
from sklearn.decomposition import PCA
#加载鸢尾花数据集导入函数
from sklearn.datasets import load_iris


def get_data(reduced_x, y):
    '''
    1.按照鸢尾花的类别将降维后的数据点保存在不同的列表中
    '''
    for i in range(len(reduced_x)):
       if y[i] == 0:
           red_x.append(reduced_x[i][0])
           red_y.append(reduced_x[i][1])
       elif y[i] == 1:
           blue_x.append(reduced_x[i][0])
           blue_y.append(reduced_x[i][1])
       else:
           green_x.append(reduced_x[i][0])
           green_y.append(reduced_x[i][1])


if __name__ == '__main__':
    #加载数据并进行降维
    data = load_iris() #以字典的形式加载鸢尾花数据集
    y = data.target #使用y表示数据集中的标签(类别)
    x = data.data #使用x表示数据集中的属性数据
    pca = PCA(n_components= 2) #设置降维后的主成分数目为2
    reduced_x = pca.fit_transform(x) #对原始数据进行降维,并保存在reduced_x中

    #按类别对降维后的数据进行保存
    red_x, red_y = [], [] #第一类数据点
    blue_x, blue_y = [], [] #第二类数据点
    green_x, green_y = [], [] #第三类数据点

    print(reduced_x)
    print(y)
    get_data(reduced_x, y)

    #对数据点的可视化
    fig = plt.figure()
    ax = fig.add_subplot()
    plt.scatter(red_x, red_y, c='r', marker= 'x')
    plt.scatter(blue_x, blue_y, c='b', marker= 'D')
    plt.scatter(green_x, green_y, c='g', marker= '.')
    plt.show()
    
  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值