目录
主成分分析
1、简介
2、帮助理解
3、API调用
4、案例
本文介绍主成分分析的概述以及python如何实现算法,后续会再出一篇关于主成分分析算法原理讲解的文章,敬请期待!
感谢大家支持!您的一键三连,就是我创作的最大动力!
主成分分析
1、简介
主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维和特征提取技术,用于将高维数据转化为低维表示,同时保留数据的主要特征。
它通过线性变换将原始特征投影到新的坐标轴上,使得投影后的特征具有最大的方差,从而达到降低数据维度的目的。
PCA 的主要思想是寻找数据中的主要方向,即数据的主成分,这些主成分是数据变化最大的方向。通过保留最重要的主成分,可以将数据的维度减少,从而减少存储和计算的成本,同时可以降低数据中的噪声和冗余信息,提高模型的泛化能力。
PCA 的工作步骤如下:
- 标准化数据
- 计算数据的协方差矩阵。
- 对协方差矩阵进行特征值分解,得到特征值和特征向量。
- 将特征值按从大到小的顺序排列,选择前几个特征值对应的特征向量作为主成分。
- 将原始数据投影到选定的主成分上,得到降维后的数据。
PCA 在许多领域中有广泛的应用,包括数据可视化、特征工程、模式识别、图像处理等。它可以帮助我们理解数据的内在结构,去除冗余信息,提高模型的效果和效率。
需要注意的是,PCA 假设数据分布在高维空间中呈线性关系,因此在存在非线性关系的情况下,PCA 可能效果不佳。在这种情况下,可以考虑使用非线性降维技术,如核主成分分析(Kernel PCA)。
2、帮助理解
如何使用最少的特征,保留原始的主成分,如图所示:
3、API调用
sklearn.decomposition.PCA(n_components=None)
将数据分解为较低维数空间
n_components:
小数:表示保留百分之多少的信息
整数:减少到多少特征
PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
返回值:转换后指定维度的array
# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2023/8/16 15:42
from sklearn.decomposition import PCA
'''
sklearn.decomposition.PCA(n_components=None)
将数据分解为较低维数空间
n_components:
小数:表示保留百分之多少的信息
整数:减少到多少特征
PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
返回值:转换后指定维度的array
'''
def pca_demo():
"""
对数据进行PCA降维
"""
data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]
# 1、实例化PCA, 小数——保留多少信息
transfer = PCA(n_components=0.9)
# 2、调用fit_transform
data1 = transfer.fit_transform(data)
print("保留90%的信息,降维结果为:\n", data1)
# 1、实例化PCA, 整数——指定降维到的维数
transfer2 = PCA(n_components=3)
# 2、调用fit_transform
data2 = transfer2.fit_transform(data)
print("降维到3维的结果:\n", data2)
if __name__ == '__main__':
pca_demo()
输出结果:
4、案例
案例:探究用户对物品类别的喜好细分降维
数据如下:
order_products__prior.csv
:订单与商品信息
字段:order_id, product_id, add_to_cart_order, reordered
products.csv
:商品信息
字段:product_id, product_name, aisle_id, department_id
orders.csv
:用户的订单信息
字段:order_id,user_id,eval_set,order_number,….
aisles.csv
:商品所属具体物品类别
字段: aisle_id, aisle
步骤:
合并表,使得user_id与aisle在一张表当中
进行交叉表变换
进行降维
代码:
from sklearn.decomposition import PCA
import pandas as pd
def data_demo():
# 1、获取数据集
# ·商品信息- products.csv:
# Fields:product_id, product_name, aisle_id, department_id
# ·订单与商品信息- order_products__prior.csv:
# Fields:order_id, product_id, add_to_cart_order, reordered
# ·用户的订单信息- orders.csv:
# Fields:order_id, user_id,eval_set, order_number,order_dow, order_hour_of_day, days_since_prior_order
# ·商品所属具体物品类别- aisles.csv:
# Fields:aisle_id, aisle
products = pd.read_csv("data/instacart/products.csv")
order_products = pd.read_csv("data/instacart/order_products__prior.csv")
orders = pd.read_csv("data/instacart/orders.csv")
aisles = pd.read_csv("data/instacart/aisles.csv")
# 2、合并表,将user_id和aisle放在一张表上
# 1)合并orders和order_products on=order_id tab1:order_id, product_id, user_id
tab1 = pd.merge(orders, order_products, on=["order_id", "order_id"])
# 2)合并tab1和products on=product_id tab2:aisle_id
tab2 = pd.merge(tab1, products, on=["product_id", "product_id"])
# 3)合并tab2和aisles on=aisle_id tab3:user_id, aisle
tab3 = pd.merge(tab2, aisles, on=["aisle_id", "aisle_id"])
# 3、交叉表处理,把user_id和aisle进行分组
table = pd.crosstab(tab3["user_id"], tab3["aisle"])
# 4、主成分分析的方法进行降维
# 1)实例化一个转换器类PCA
transfer = PCA(n_components=0.95)
# 2)fit_transform
data = transfer.fit_transform(table)
print(data.shape)
if __name__ == '__main__':
data_demo()
结果: