ハルビン工科大学の修士課程の学生が11の古典的なデータ次元削減アルゴリズムをPythonで実装し、ソースコードライブラリが公開されました。

ハルビン工科大学の修士課程の学生が11の古典的なデータ次元削減アルゴリズムをPythonで実装し、ソースコードライブラリが公開されました。

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式サイトにアクセスして許可を申請してください。

インターネット上のさまざまな次元削減アルゴリズムに関する情報は混在しており、そのほとんどはソースコードを提供していません。こちらは、PCA、LDA、MDS、LLE、TSNEなどを含む11の古典的なデータ抽出(データ次元削減)アルゴリズムをPythonで実装したGitHubプロジェクトで、関連資料とデモンストレーション効果も含まれています。機械学習の初心者やデータマイニングを始めたばかりの人に最適です。

[[283851]]

なぜデータの次元を削減する必要があるのでしょうか?

いわゆる次元削減とは、DベクトルXiに含まれる有用な情報をdベクトルZiの集合で表現することである。ここでd

通常、ほとんどのデータ セットの次元は数百または数千にもなりますが、従来の MNIST の次元は 64 です。

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

しかし、実際のアプリケーションでは、使用する有用な情報にそれほど高い次元は必要なく、各追加次元に必要なサンプル数は指数関数的に増加し、巨大な「次元災害」に直接つながる可能性があります。データの次元削減により、これを実現できます。

  • データセットを使いやすくする

  • 変数が互いに独立していることを確認する

  • アルゴリズムの計算コストを削減

  • ノイズ除去

この情報を正しく処理し、次元削減を正確かつ効果的に実行できるようになれば、計算量を大幅に削減し、機械操作の効率を向上させることができます。データの次元削減は、テキスト処理、顔認識、画像認識、自然言語処理などの分野でもよく使用されます。

データ次元削減の原則

多くの場合、高次元空間のデータはまばらに分布しているため、次元削減のプロセスでは通常、冗長データ、無効な情報、繰り返し表現などを含むデータの削除が行われます。

例えば、1024×1024の画像があるとします。中央の50×50の領域を除いて、他の位置はすべてゼロです。これらのゼロ情報は役に立たない情報として分類でき、対称図形の場合は、対称部分の情報が重複情報として分類できます。

[[283852]]

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

  • 線形次元削減法:

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 年にカール ピアソンによって提案され、線形次元削減法に属します。 PCA に関連する原理は、最大分散理論または最小誤差理論と呼ばれることがよくあります。これら 2 つの目標は同じですが、プロセスの焦点は異なります。

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

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

  • アルゴリズム入力: データ セット Xmxn;

  • データ セット X の平均 Xmean を列ごとに計算し、Xnew=X−Xmean と設定します。

  • 行列Xnewの共分散行列を解き、それをCovとして記録します。

  • 共分散行列 COv の固有値と対応する固有ベクトルを計算します。

  • 固有値を大きい順に並べ替え、最大のkを選択し、対応するk個の固有ベクトルを列ベクトルとして使用して、固有ベクトル行列Wnxkを形成します。

  • XnewW を計算します。つまり、データセット Xnew を選択した固有ベクトルに投影して、必要な低次元データセット XnewW を取得します。

最小誤差理論次元削減原理

最小誤差は平均投影コストを最小化する線形投影です。このプロセスでは、二乗誤差評価関数 J0(x0) などのパラメータを見つける必要があります。

詳細な手順については、「主成分分析 (PCA) アルゴリズムを最初から実装する」を参照してください。

https://blog.csdn.net/u013719780/article/details/78352262

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

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

  1. __future__ からprint_functionをインポートする
  2.  
  3. sklearnからデータセットをインポートする
  4.  
  5. matplotlib.pyplot を plt としてインポートします
  6.  
  7. matplotlib.cm を cmx としてインポートします
  8.  
  9. matplotlib.colorsをcolorsとしてインポートする
  10.  
  11. numpyをnpとしてインポートする
  12.  
  13. %matplotlib インライン
  14.  
  15. def shuffle_data(X, y, シード=なし):
  16.  
  17. シードの場合:
  18.  
  19. np.random.seed(シード)
  20.  
  21. idx = np.arange(X.shape[ 0 ])
  22.  
  23. np.ランダムシャッフル(idx)
  24.  
  25. X[idx]、y[idx]を返す
  26.  
  27. # データセットXを正規化する
  28.  
  29. def normalize(X, 軸=- 1 , p= 2 ):
  30.  
  31. lp_norm = np.atleast_1d(np.linalg.norm(X, p, 軸))
  32.  
  33. lp_norm[lp_norm == 0 ] = 1  
  34.  
  35. X / np.expand_dims(lp_norm, axis)を返す
  36.  
  37. # データセットXを正規化する
  38.  
  39. def標準化(X):
  40.  
  41. X_std = np.zeros(X.shape)
  42.  
  43. 平均 = X.平均(軸= 0 )
  44.  
  45. std = X.std(軸= 0 )
  46.  
  47. # 割り算をするときは、分母が0にならないことを常に覚えておいてください
  48.  
  49. # X_std = (X - X.mean(axis= 0 )) / X.std(axis= 0 )
  50.  
  51. 範囲(np.shape(X)[ 1 ])内の列の場合:
  52.  
  53. std[col]の場合:
  54.  
  55. X_std[:, col] = (X_std[:, col] - 平均[col]) / std[col]
  56.  
  57. X_stdを返す
  58.  
  59. # データセットをトレーニングセットとテストセットに分割する
  60.  
  61. def train_test_split(X, y, test_size= 0.2 , shuffle=True, seed=None):
  62.  
  63. シャッフルの場合:
  64.  
  65. X, y = shuffle_data(X, y, シード)
  66.  
  67. n_train_samples = int (X.shape[ 0 ] * ( 1- test_size))
  68.  
  69. x_train、x_test = X[:n_train_samples]、X[n_train_samples:]
  70.  
  71. y_train、y_test = y[:n_train_samples]、y[n_train_samples:]
  72.  
  73. x_train、x_test、y_train、y_testを返す
  74.  
  75. # 行列Xの共分散行列を計算する
  76.  
  77. def calculate_covariance_matrix(X, Y=np.empty(( 0 , 0 ))):
  78.  
  79. そうでない場合:
  80.  
  81. Y = X
  82.  
  83. n_samples = np.shape(X)[ 0 ]
  84.  
  85. 共分散行列 = ( 1 / (n_samples - 1 )) * (X - X.mean(axis= 0 )).T.dot(Y - Y.mean(axis= 0 ))
  86.  
  87. np.array(共分散行列、dtype= float )を返します
  88.  
  89. # データセットXの各列の分散を計算する
  90.  
  91. def calculate_variance(X):
  92.  
  93. n_samples = np.shape(X)[ 0 ]
  94.  
  95. 分散 = ( 1 / n_samples ) * np.diag((X - X.mean(axis= 0 )).T.dot(X - X.mean(axis= 0 )))
  96.  
  97. リターンの差異
  98.  
  99. # データセットXの各列の標準偏差を計算する
  100.  
  101. def calculate_std_dev(X):
  102.  
  103. std_dev = np.sqrt(calculate_variance(X))
  104.  
  105. std_devを返す
  106.  
  107. # 相関係数行列を計算する
  108.  
  109. def calculate_correlation_matrix(X, Y=np.empty([ 0 ])):
  110.  
  111. # 最初に共分散行列を計算する
  112.  
  113. 共分散行列 = 共分散行列を計算する(X, Y)
  114.  
  115. # X、Yの標準偏差を計算する
  116.  
  117. std_dev_X = np.expand_dims(calculate_std_dev(X), 1 )
  118.  
  119. std_dev_y = np.expand_dims(calculate_std_dev(Y), 1 )
  120.  
  121. 相関行列 = np.divide(共分散行列、std_dev_X.dot(std_dev_y.T))
  122.  
  123. np.array(correlation_matrix, dtype= float )を返します
  124.  
  125. クラスPCA:
  126.  
  127. 「」 「
  128.  
  129. 主成分分析アルゴリズム PCA、教師なし学習アルゴリズム。
  130.  
  131. 「」 「
  132.  
  133. __init__(self)を定義します。
  134.  
  135. self.eigen_values ​​= なし
  136.  
  137. self.eigen_vectors = なし
  138.  
  139. 自己.k = 2  
  140.  
  141. def transform(self, X):
  142.  
  143. 「」 「
  144.  
  145. 元のデータセットXはPCAによって次元が縮小される
  146.  
  147. 「」 「
  148.  
  149. 共分散 = calculate_covariance_matrix(X)
  150.  
  151. # 固有値と固有ベクトルを解く
  152.  
  153. self.eigen_values、self.eigen_vectors = np.linalg.eig(共分散)
  154.  
  155. # 固有値を大きい順に並べます。固有ベクトルは列ごとに並べられていることに注意してください。つまり、self.eigen_vectors の k 番目の列は、self.eigen_values の k 番目の固有値に対応する固有ベクトルです。
  156.  
  157. idx = 自己.固有値.argsort[::- 1 ]
  158.  
  159. 固有値 = self.eigen_values[idx][:self.k]
  160.  
  161. 固有ベクトル = self.eigen_vectors[:, idx][:, :self.k]
  162.  
  163. # 元のデータセットXを低次元空間にマッピングする
  164.  
  165. X_transformed = X.dot(固有ベクトル)
  166.  
  167. X_transformedを返す
  168.  
  169. 定義メイン:
  170.  
  171. # データセットをロードする
  172.  
  173. データ = datasets.load_iris
  174.  
  175. X = データ.データ
  176.  
  177. y = データ.ターゲット
  178.  
  179. # データセットXをより低次元の空間にマッピングする
  180.  
  181. X_trans = PCA.transform(X)
  182.  
  183. x1 = X_trans[:, 0 ]
  184.  
  185. x2 = X_trans[:, 1 ]
  186.  
  187. cmap = plt.get_cmap( 'viridis' )
  188.  
  189. colors = [cmap(i) は inp.linspace( 0 , 1 , len(np.unique(y)))]に格納します。
  190.  
  191. クラス_ディストリビューション =
  192.  
  193. # 異なるクラス分布をプロットする
  194.  
  195. i, l が enumerate(np.unique(y)) の場合:
  196.  
  197. _x1 = x1[y == l]
  198.  
  199. _x2 = x2[y == l]
  200.  
  201. _y = y[y == l]
  202.  
  203. class_distr.append(plt.scatter(_x1, _x2, 色=colors[i]))
  204.  
  205. # 凡例を追加する
  206.  
  207. plt.legend(class_distr, y, loc= 1 )
  208.  
  209. # 軸ラベル
  210.  
  211. plt.xlabel( '主成分1' )
  212.  
  213. plt.ylabel( '主成分2' )
  214.  
  215. plt.show
  216.  
  217. __name__ == "__main__"の場合:
  218.  
  219. 主要

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

PCA 次元削減アルゴリズムのデモンストレーション

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

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

  • KPCA (カーネル PCA)

KPCA はカーネル技術と PCA を組み合わせたものです。PCA との主な違いは、共分散行列を計算するときにカーネル関数が使用されること、つまりカーネル関数によってマッピングされた後の共分散行列が使用されることです。

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

KPCA 次元削減アルゴリズムのデモンストレーション

詳細については、「Python 機械学習」の特徴抽出 - kPCA を参照してください。

https://blog.csdn.net/weixin_40604987/article/details/79632888

コードアドレス:

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

  • LDA(線形判別分析)

LDA は、分類などのタスクで異なるクラスのサンプルを効果的に分離できるように、クラス間の差を最大化し、クラス内の差を最小化することを目的とした特徴抽出手法です。 LDA は、データ分析プロセスにおける計算効率を向上させ、正規化されていないモデルの次元の呪いによって引き起こされる過剰適合を軽減することができます。

LDA 次元削減アルゴリズムのデモンストレーション

詳細については、「データの次元削減 - 線形判別分析 (LDA)」を参照してください。

https://blog.csdn.net/ChenVast/article/details/79227945

コードアドレス:

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

  • MDS(多次元尺度法)

MDS(多次元尺度法)は、直感的な空間グラフを使用して研究対象の認識や好みを表す従来の次元削減手法です。この方法では、任意の 2 つのサンプル ポイント間の距離を計算し、低次元空間への投影後に相対距離を維持して投影を実現します。

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

MDS 次元削減アルゴリズムのデモンストレーション

詳細については、「MDSアルゴリズム」を参照してください。

https://blog.csdn.net/zhangweiguo_717/article/details/69663452

コードアドレス:

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

  • ISOマップ

Isomap は等尺性マッピング アルゴリズムであり、非線形構造データ セットにおける MDS アルゴリズムの欠点を効果的に解決できます。

MDS アルゴリズムは次元削減後もサンプル間の距離を変更しませんが、Isomap アルゴリズムは近傍グラフを導入します。近傍グラフではサンプルが隣接するサンプルにのみ接続され、隣接するポイント間の距離が計算され、これに基づいて次元削減が実行され、距離が維持されます。

ISOMAP 次元削減アルゴリズムのデモンストレーション

詳細についてはIsomapを参照してください。

https://blog.csdn.net/zhangweiguo_717/article/details/69802312

コードアドレス:

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

  • LLE (局所線形埋め込み)

LLE は Local Linear Embedding の略で、非線形次元削減アルゴリズムです。アルゴリズムの核となる考え方は、各ポイントは複数の隣接ポイントの線形結合によって近似的に再構築でき、その後、高次元データを低次元空間に投影して、データポイント間のローカル線形再構築関係が維持されるようにする、つまり同じ再構築係数が得られるというものです。いわゆる多様体次元削減を扱う場合、PCA よりもはるかにうまく機能します。

LLE 次元削減アルゴリズムのデモンストレーション

詳細については、「LLEの原理と導出プロセス」を参照してください。

https://blog.csdn.net/scott198510/article/details/76099630

コードアドレス:

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

  • t-SNE

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

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

t-SNE 次元削減アルゴリズムのデモンストレーション

詳細については、「t-SNE の使用上の注意点」を参照してください。

http://bindog.github.io/blog/2018/07/31/t-sne-tips/

コードアドレス:

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

  • LE (ラプラシアン固有マップ)

LE は Laplace Eigenmap の略で、LLE アルゴリズムに多少似ており、ローカルな観点からデータ間の関係を構築します。直感的な考え方としては、関連する点(グラフ内の接続された点)を縮小された次元空間内で可能な限り近くに保つことです。このようにして、多様体の幾何学的構造を反映した解を得ることができます。

LE次元削減アルゴリズムのデモンストレーション

詳細については、「ラプラシアン特徴マップの次元削減とその Python 実装」を参照してください。

https://blog.csdn.net/HUSTLX/article/details/50850342

コードアドレス:

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

  • LPP(局所保存投影)

LPP は局所性保存投影アルゴリズムです。その考え方はラプラス固有マップに似ています。中心となる考え方は、データセットの近傍構造情報を最適に保存して投影マッピングを構築することです。ただし、LPP は投影結果を直接取得するという点で LE とは異なります。投影行列を解く必要があります。

LPP 次元削減アルゴリズムのデモンストレーション

詳細については、「局所保存投影アルゴリズム (LPP) の詳細説明」を参照してください。

https://blog.csdn.net/qq_39187538/article/details/90402961

コードアドレス:

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

*プロジェクト「dimensionality_reduction_alo_codes」の作者について

Heucoder は現在、ハルビン工業大学のコンピューター技術の修士課程に在籍しています。主にインターネット分野で活躍しています。彼の Zhihu でのニックネームは「Super Love Learning」です。彼の github ホームページ アドレスは https://github.com/heucoder です

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

https://github.com/heucoder/dimensionality_reduction_alo_codes

<<:  AIと機械学習がSaaS業界にどのような変化をもたらすか

>>:  とてもかっこいいですね! Python で人工知能の最適化アルゴリズムを 5 分で理解する

推薦する

機械学習を簡単に理解!クラスタリング、回帰、分類アルゴリズムを説明する 3 つのケース

機械はどのように学習し、何を学ぶのでしょうか?人間はどうやって機械に学習を教えるのでしょうか?この記...

...

俳優の顔の交換、AIデート、モザイク除去…2020年のAI界の注目トピックトップ10を振り返る

[[373822]] 2020年が終わりを迎えました。今年、人工知能(AI)分野は浮き沈みに富み、常...

幼稚園のAI教材を公開!プログラミング学習は幼稚園から始まる

AIの学習は幼稚園から始まる最近、インターネット上で「人工知能実験教科書」の写真が流通している。この...

ラマ2 ビッグバン!バークレーは実機テストで8位、iPhoneでローカル実行可能、多数のアプリが無料でプレイ可能、ルカンも夢中

昨日、Meta は Llama 2 の無料商用バージョンをリリースし、再びオープンソース コミュニテ...

GenAI はデータ分析分野のどこに位置づけられるのでしょうか?

今日のビジネスにおける人工知能の多くの応用のうちの 1 つが予測分析です。データ セットを分析してパ...

...

準備はできたか? GNN グラフ ニューラル ネットワーク 2021 年の主要なアプリケーション ホットスポット 5 つ

[[378224]]今年から始めます。グラフニューラルネットワークは研究者の間で話題になっており、こ...

...

...

人工知能がビジネスに進出

人工知能は、時間の経過とともに改良を続け、世界中の人々から賞賛されてきた、人間の設計の驚異です。 T...

...

ディープラーニングとニューラルネットワーク: 注目すべき 6 つのトレンド

ニューラル ネットワークの基本的な考え方は、コンピューターの「脳」内の複数の相互接続されたセルをシミ...

2023年に人工知能を学ぶべき主な理由

テクノロジーとイノベーションがダイナミックに変化する中、人工知能 (AI) の研究は学生や専門家にと...

...