ホームページ  >  記事  >  バックエンド開発  >  Python は 12 次元削減アルゴリズムを実装します

Python は 12 次元削減アルゴリズムを実装します

WBOY
WBOY転載
2023-04-12 22:55:131677ブラウズ

皆さんこんにちは、ピーターです~

インターネット上のさまざまな次元削減アルゴリズムに関する情報は不均一で、ほとんどのアルゴリズムではソース コードが提供されていません。これは、Python を使用して、PCA、LDA、MDS、LLE、TSNE などの 11 の古典的なデータ抽出 (データ次元削減) アルゴリズムを実装する GitHub プロジェクトです。関連情報と表示効果が含まれており、機械学習の初心者や初心者に非常に適しています。データマイニングを始めたばかりの方。

データの次元削減を実行する必要があるのはなぜですか?

いわゆる次元削減とは、ベクトルに含まれる有用な情報を表すために、d の数を持つベクトル Zi のセットを使用することです。 Xi に数字 D を付けます。ここで、d

通常、ほとんどのデータ セットの次元は数百、さらには数千であり、古典的な MNIST の次元はすべて 64 であることがわかります。

Python は 12 次元削減アルゴリズムを実装します

MNIST 手書き数字データ セット

しかし、実際のアプリケーションでは、私たちが使用する有用な情報にはそれほど高い次元は必要なく、データの数が増加するたびに、 1 つの次元に必要なサンプルは指数関数的に増加し、これは大規模な「次元災害」に直接つながる可能性があります。データ次元の削減によって次のことが達成できます。

  • データ セットを使いやすくする
  • 次のことを確認します。変数は互いに独立しています。
  • アルゴリズム計算のコストを削減します。

ノイズを除去します。この情報を正しく処理し、次元削減を正確かつ効果的に実行できれば、ノイズの削減に大きく役立ちます。計算量が削減され、機械の稼働効率が向上します。データの次元削減は、テキスト処理、顔認識、画像認識、自然言語処理などの分野でもよく使用されます。

データの次元削減の原則

高次元空間のデータはまばらに分散していることが多いため、次元削減のプロセス中に、通常、データの削除が行われます。これらのデータには、冗長データ、無効な情報や重複した表現などは削除されます。

例: 1024*1024 の画像があります。中央の 50*50 の領域を除いて、他の位置はすべてゼロ値です。これらのゼロ情報は役に立たない情報として分類できます。対称グラフィックスの場合、情報の対称的な部分は、繰り返される情報として分類できます。

したがって、ほとんどの古典的な次元削減手法もこの内容に基づいています。次元削減手法は、線形次元削減と非線形次元削減に分けられます。非線形次元削減は、カーネル関数ベースと固有値ベースの手法に分けられます。

  • 線形次元削減方法: PCA、ICA LDA、LFA、LPP (LE の線形表現)
  • 非線形次元削減方法:

に基づくカーネル関数の非線形次元削減法 - KPCA、KICA、KDA

固有値に基づく非線形次元削減法 (フローパターン学習) - ISOMAP、LLE、LE、LPP、LTSA、MVU

Heucoderハルビン工業大学でコンピューター技術を専攻する修士課程の学生である彼は、PCA、KPCA、LDA、MDS、ISOMAP、LLE、TSNE、AutoEncoder、FastICA、SVD、LE、LPP を含む合計 12 の古典的な次元削減アルゴリズムをコンパイルしました。以下では、主に PCA アルゴリズムを例として、次元削減アルゴリズムの具体的な動作を紹介します。

主成分分析 (PCA) 次元削減アルゴリズム

PCA は、高次元空間から低次元空間へのマッピングに基づくマッピング手法であり、最も基本的な教師なし次元削減アルゴリズムでもあります。目標は、データが最も大きく変化する方向、または再構成誤差が最小になる方向に投影することです。これは、1901 年に Karl Pearson によって提案された、線形次元削減手法です。 PCA に関連する原理は、最大分散理論または最小誤差理論と呼ばれることがよくあります。この 2 つは同じ目標を持っていますが、プロセスの焦点が異なります。

Python は 12 次元削減アルゴリズムを実装します

最大分散理論の次元削減原理

N 次元ベクトルのセットを K 次元 (K は 0 より大きく、N より小さい) に削減します。目標は、K 個の単位直交基底があり、各フィールドの COV(X,Y) が 0 で、フィールドの分散ができるだけ大きいことを選択することです。したがって、最大分散は投影データの分散が最大化されていることを意味します。このプロセスでは、データセット Xmxn の最適な投影空間 Wnxk や共分散行列などを見つける必要があります。アルゴリズム フローは次のとおりです:

  • アルゴリズム入力: データセット Xmxn;
  • Cov として示されるデータセットの平均 Xmean を計算します;
  • 共分散行列 COV の固有値と対応する固有ベクトルを計算します。
  • 固有値を大きいものから小さいものに並べ替え、最大の k 個の固有値を選択します。その後、対応する k 個の固有ベクトルが列ベクトルとして使用されて固有ベクトル行列 Wnxk を形成します。
  • XnewW を計算します。つまり、データ セット Xnew を選択した固有ベクトルに投影し、必要な次元削減データ SetXnewW を取得します。

Python は 12 次元削減アルゴリズムを実装します最小誤差理論の次元削減原理

最小誤差は平均投影コストを最小にする線形投影であり、その際に二乗誤差評価関数J0(x0)などのパラメータを求める必要があります。

  • 主成分分析 (PCA) コードの実装

Python は 12 次元削減アルゴリズムを実装します

PCA アルゴリズムのコードは次のとおりです:

from __future__ import print_function
from sklearn import datasets
import matplotlib.pyplot as plt
import matplotlib.cm as cmx
import matplotlib.colors as colors
import numpy as np
%matplotlib inline

def shuffle_data(X, y, seed=None):
 if seed:
 np.random.seed(seed)

 idx = np.arange(X.shape[0])
 np.random.shuffle(idx)

 return X[idx], y[idx]

# 正规化数据集 X
def normalize(X, axis=-1, p=2):
 lp_norm = np.atleast_1d(np.linalg.norm(X, p, axis))
 lp_norm[lp_norm == 0] = 1
 return X / np.expand_dims(lp_norm, axis)

# 标准化数据集 X
def standardize(X):
 X_std = np.zeros(X.shape)
 mean = X.mean(axis=0)
 std = X.std(axis=0)

 # 做除法运算时请永远记住分母不能等于 0 的情形
 # X_std = (X - X.mean(axis=0)) / X.std(axis=0)
 for col in range(np.shape(X)[1]):
 if std[col]:
 X_std[:, col] = (X_std[:, col] - mean[col]) / std[col]
 return X_std

# 划分数据集为训练集和测试集
def train_test_split(X, y, test_size=0.2, shuffle=True, seed=None):
 if shuffle:
 X, y = shuffle_data(X, y, seed)
 n_train_samples = int(X.shape[0] * (1-test_size))
 x_train, x_test = X[:n_train_samples], X[n_train_samples:]
 y_train, y_test = y[:n_train_samples], y[n_train_samples:]

 return x_train, x_test, y_train, y_test

# 计算矩阵 X 的协方差矩阵
def calculate_covariance_matrix(X, Y=np.empty((0,0))):
 if not Y.any():
Y = X
 n_samples = np.shape(X)[0]
 covariance_matrix = (1 / (n_samples-1)) * (X - X.mean(axis=0)).T.dot(Y - Y.mean(axis=0))
 return np.array(covariance_matrix, dtype=float)

# 计算数据集 X 每列的方差
def calculate_variance(X):
 n_samples = np.shape(X)[0]
 variance = (1 / n_samples) * np.diag((X - X.mean(axis=0)).T.dot(X - X.mean(axis=0)))
 return variance

# 计算数据集 X 每列的标准差
def calculate_std_dev(X):
 std_dev = np.sqrt(calculate_variance(X))
 return std_dev

# 计算相关系数矩阵
def calculate_correlation_matrix(X, Y=np.empty([0])):
 # 先计算协方差矩阵
 covariance_matrix = calculate_covariance_matrix(X, Y)
 # 计算 X, Y 的标准差
 std_dev_X = np.expand_dims(calculate_std_dev(X), 1)
 std_dev_y = np.expand_dims(calculate_std_dev(Y), 1)
 correlation_matrix = np.divide(covariance_matrix, std_dev_X.dot(std_dev_y.T))

 return np.array(correlation_matrix, dtype=float)

class PCA():
 """
 主成份分析算法 PCA,非监督学习算法.
 """
 def __init__(self):
 self.eigen_values = None
 self.eigen_vectors = None
 self.k = 2

 def transform(self, X):
 """
 将原始数据集 X 通过 PCA 进行降维
 """
 covariance = calculate_covariance_matrix(X)

 # 求解特征值和特征向量
 self.eigen_values, self.eigen_vectors = np.linalg.eig(covariance)

 # 将特征值从大到小进行排序,注意特征向量是按列排的,即 self.eigen_vectors 第 k 列是 self.eigen_values 中第 k 个特征值对应的特征向量
 idx = self.eigen_values.argsort()[::-1]
 eigenvalues = self.eigen_values[idx][:self.k]
 eigenvectors = self.eigen_vectors[:, idx][:, :self.k]

 # 将原始数据集 X 映射到低维空间
 X_transformed = X.dot(eigenvectors)

 return X_transformed

def main():
 # Load the dataset
 data = datasets.load_iris()
 X = data.data
 y = data.target

 # 将数据集 X 映射到低维空间
 X_trans = PCA().transform(X)

 x1 = X_trans[:, 0]
 x2 = X_trans[:, 1]

 cmap = plt.get_cmap('viridis')
 colors = [cmap(i) for i in np.linspace(0, 1, len(np.unique(y)))]

 class_distr = []
 # Plot the different class distributions
 for i, l in enumerate(np.unique(y)):
 _x1 = x1[y == l]
 _x2 = x2[y == l]
 _y = y[y == l]
 class_distr.append(plt.scatter(_x1, _x2, color=colors[i]))

 # Add a legend
 plt.legend(class_distr, y, loc=1)

 # Axis labels
 plt.xlabel('Principal Component 1')
 plt.ylabel('Principal Component 2')
 plt.show()

if __name__ == "__main__":
 main()

最後に、次のように次元削減の結果が得られます。その中で、特徴量 (D) がサンプル数 (N) よりもはるかに大きい場合に、ちょっとしたトリックを使用して PCA アルゴリズムの複雑度変換を実装できます。

Python は 12 次元削減アルゴリズムを実装します

PCA 次元削減アルゴリズムの表示

もちろん、このアルゴリズムは古典的で一般的に使用されていますが、欠点も非常に明らかです。線形相関は非常にうまく除去できますが、高次の相関に直面した場合は効果が乏しく、同時に PCA 実装の前提はデータの主な特徴が直交方向に分布していると仮定することです。非直交方向の場合 分散が大きい方向がいくつかあるため、PCA の効果は大幅に減少します。

その他の次元削減アルゴリズムとコード アドレス

  • KPCA(カーネル PCA)

KPCA は、カーネル テクノロジと PCA を組み合わせた製品です。違いは、共分散行列を計算するときにカーネル関数が使用されることです。これは、カーネル関数によるマッピング後の共分散行列です。

カーネル関数の導入により、非線形データ マッピングの問題を非常にうまく解決できます。 kPCA は非線形データを高次元空間にマッピングできます。標準 PCA を使用して非線形データを別の低次元空間にマッピングします。

Python は 12 次元削減アルゴリズムを実装します

KPCA 次元削減アルゴリズムの表示

コード アドレス:

https://github.com/heucoder/Dimensionity_reduction_alo_codes/blob/master /codes/PCA/KPCA.py

  • LDA(線形判別分析)

LDA は特徴抽出として使用できるテクノロジーであり、その目標は次のとおりです。クラス間の差異を最大化し、分類などのタスク、つまり異なるクラスのサンプルを効果的に分離することを容易にするために、クラス内差異の方向性の投影を最小限に抑えます。 LDA は、データ分析プロセスの計算効率を向上させ、正則化できないモデルの次元性の障害によって引き起こされる過剰適合を軽減できます。

Python は 12 次元削減アルゴリズムを実装します

LDA 次元削減アルゴリズムの表示

コード アドレス:

https://github.com/heucoder/Dimensionity_reduction_alo_codes/tree/master /codes/LDA

  • MDS(多次元スケーリング)

MDS は多次元スケーリング分析であり、研究対象の認識や好みを直感的な空間図で表現する手法です。 . 従来の次元削減方法。この方法では、任意の 2 つのサンプル点間の距離を計算し、低次元空間に投影して投影を達成した後も相対距離を維持できるようにします。

sklearn の MDS は反復最適化手法を採用しているため、以下では反復手法と非反復手法の両方を実装します。

Python は 12 次元削減アルゴリズムを実装します

MDS 次元削減アルゴリズムの表示

コード アドレス:

https://github.com/heucoder/Dimensionity_reduction_alo_codes/tree/master /codes/MDS

  • ISOMAP

Isomap は等尺性マッピング アルゴリズムです。このアルゴリズムは、非線形構造化データ セットに対する MDS アルゴリズムの欠点をうまく解決します。

MDS アルゴリズムでは、次元削減後のサンプル間の距離は変更されませんが、Isomap アルゴリズムでは近傍グラフが導入されます。サンプルは隣接するサンプルにのみ接続され、隣接する点間の距離を計算して、ここに追加されます。次元削減と距離保存に基づいています。

Python は 12 次元削減アルゴリズムを実装します

ISOMAP 次元削減アルゴリズムの表示

コード アドレス:

https://github.com/heucoder/Dimensionity_reduction_alo_codes/tree/master /codes/ISOMAP

LLE(ローカル線形埋め込み)LLE は、非線形次元削減アルゴリズムであるローカル線形埋め込みアルゴリズムです。このアルゴリズムの核となる考え方は、各点は複数の隣接する点の線形結合によって近似的に再構成され、その後、高次元データが低次元空間に投影されて、データ間で局所的な線形再構成が維持されるということです。つまり、同じ再構成係数を持ちます。いわゆる多様体の次元削減を扱う場合、その効果は PCA よりもはるかに優れています。

Python は 12 次元削減アルゴリズムを実装します

LLE 次元削減アルゴリズムの表示

コード アドレス:

https://github.com/heucoder/Dimensionity_reduction_alo_codes/tree/master/codes/LLE

    # #t-SNE
t-SNE は非線形次元削減アルゴリズムでもあり、高次元データを 2 次元または 3 次元に削減して視覚化するのに非常に適しています。これは、データの元の傾向に基づいて低緯度 (2 次元または 3 次元) のデータ傾向を再構築する教師なし機械学習アルゴリズムです。

次の結果表示はソース コードを参照しており、tensorflow を使用して実装することもできます (パラメーターを手動で更新する必要はありません)。

Python は 12 次元削減アルゴリズムを実装します

t-SNE 次元削減アルゴリズムの表示

コードアドレス:

https://github.com/heucoder/Dimensionity_reduction_alo_codes/tree /master/codes/T-SNE

    LE(ラプラシアン固有マップ)
LE はラプラシアン固有マップであり、LLE アルゴリズムに似ており、また以下に基づいています。ローカル データ間の関係を構築する観点から。その直感的なアイデアは、互いに関連する点 (グラフ内で接続されている点) が次元削減された空間内でできるだけ近くにあることを期待することであり、このようにして、多様体の幾何学的構造を反映できる解を得ることができます。 。

Python は 12 次元削減アルゴリズムを実装します

LE 次元削減アルゴリズムの表示

コード アドレス:

https://github.com/heucoder/Dimensionity_reduction_alo_codes/tree/master /codes/LE

    LPP (局所性保持射影)
LPP は局所性保持射影アルゴリズムです。その考え方はラプラシアン特徴マッピングに似ています。中心的な考え方は次のとおりです。 pass 投影マッピングを構築するにはデータセットの近傍構造情報を維持するのが最善ですが、LPP は投影結果を直接取得する点で LE とは異なり、投影行列を解く必要があります。

Python は 12 次元削減アルゴリズムを実装します

LPP 次元削減アルゴリズムの表示

コード アドレス:

https://github.com/heucoder/Dimensionity_reduction_alo_codes/tree/master /codes/LPP

    *「Dimensionity_reduction_alo_codes」プロジェクトの作成者について
Heucoder は現在、ハルビン工業大学でコンピューター技術の修士課程に在籍しており、主に次の分野で活躍しています。インターネット分野、Zhihu 愛称は「Super Love Learning」、Github ホームページのアドレスは https://github.com/heucoder です。

Github プロジェクトのアドレス:

https://github.com/heucoder/Dimensionity_reduction_alo_codes

以上がPython は 12 次元削減アルゴリズムを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。