目次
この記事では、主成分分析の概要と、Python がアルゴリズムを実装する方法について紹介します。主成分分析アルゴリズムの数学的原理に関する記事については、次の記事を参照してください。
ご協力ありがとうございます!あなたの 1 クリック 3 リンクが、私の創作の最大の動機です。
主成分分析
1 はじめに
主成分分析 (PCA) は、データの主な特徴を保持しながら高次元データを低次元表現に変換するために一般的に使用されるデータの次元削減および特徴抽出手法です。
線形変換を通じて元の特徴を新しい座標軸に投影し、投影された特徴の分散が最大になるようにして、データ次元を削減するという目的を達成します。
PCA の主な考え方は、データ内の主な方向、つまりデータの主成分を見つけることです。これらの主成分は、データが最も大きく変化する方向です。最も重要な主成分を保持することにより、データの次元を削減できるため、ストレージとコンピューティングのコストが削減されると同時に、データ内のノイズと冗長な情報が削減され、モデルの汎化能力が向上します。
PCA の作業手順は次のとおりです。
- 正規化されたデータ
- データの共分散行列を計算します。
- 共分散行列に対して固有値分解を実行して、固有値と固有ベクトルを取得します。
- 固有値を降順に並べ、最初のいくつかの固有値に対応する固有ベクトルを主成分として選択します。
- 元のデータを選択した主成分に投影して、次元削減されたデータを取得します。
PCA は、データ視覚化、特徴エンジニアリング、パターン認識、画像処理などを含む多くの分野で幅広く応用されています。これは、データの内部構造を理解し、冗長な情報を削除し、モデルの有効性と効率を向上させるのに役立ちます。
PCA はデータ分布が高次元空間で線形であると仮定しているため、非線形関係が存在する場合には PCA がうまく機能しない可能性があることに注意することが重要です。このような場合、カーネル主成分分析 (カーネル PCA) などの非線形次元削減技術を検討できます。
2. 理解を助ける
図に示すように、最小限の機能を使用して元の主成分を保持する方法:
3. API呼び出し
sklearn.decomposition.PCA(n_components=なし)
データをより低次元の空間に分解する
n_components:
10 進数: 情報の何パーセントが保持されるかを示します。
整数: 削減する特徴の数
PCA.fit_transform(X) X: numpy 配列形式のデータ [n_samples, n_features]
戻り値: 変換後の指定次元の配列
# -*- 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 と Ireland が 1 つのテーブルに収まるようにします
クロス集計変換を実行する
次元削減を実行する
コード:
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()
結果: