機械学習の次元削減のためのPCA(Pythonコード+データ)

機械学習のPCA

まず、次の4つの部分に分かれています。

  • アプリケーションの背景を生成する
  • デザインのアイデア
  • ケースプラクティス
  • 総括する
  • 付録

1.アプリケーションの背景を生成する

主成分分析、略してPCAは、データの前処理に使用されるデータ次元削減技術です。通常、取得する元のデータの次元は非常に高く、1000の特徴などです。これらの1000の特徴には、役に立たない情報やノイズがたくさん含まれている可能性があります。本当に役立つ特徴は100しかありません。PCAアルゴリズムを使用して1000の特徴を変換できます。 100機能まで。これは無駄なノイズを取り除くだけでなく、多くの計算を減らすこともできます。
PCAでは、データは元の座標系から新しい座標系に変換されます。もちろん、ここでの新しい座標系は任意に設定されるものではなく、データ自体の特性に応じて設計する必要があります。通常、最初の新しい座標軸は、元のデータの分散が最大の方向を選択し、2番目の座標軸は、最初の座標軸に直交し、分散が最大の方向です。この文の意味は、2番目に選択した方向と最初の方向との相関が弱いことです。
総括する

  • 次元の削減は、次元の災害問題を軽減することができます
  • 次元削減により、データ圧縮中の情報損失を最小限に抑えることができます
  • 数百次元のデータ構造を理解することは困難であり、2次元または3次元のデータは視覚化により理解しやすくなります

2.デザインのアイデア

PCA主成分分析アルゴリズムは、高次元座標系を低次元座標系にマッピングする線形次元削減です。
低次元の座標系を選択するにはどうすればよいですか?これは、共分散行列の固有値と固有ベクトル、および共分散行列の固有値と固有ベクトルを見つけることです。固有ベクトルは座標系を表し、固有値は新しい座標にマッピングされた長さを表し、
データ変換を実行します。
しかし、それは驚くべきことだと思いますか?なぜ共分散を求めるためのより大きな固有ベクトルが最も理想的なk次元ベクトルなのですか?
実験的なプロジェクトを見てみましょう!

3.ケースプラクティス

知識予備

  • 分散:変動を説明する
    ここに画像の説明を挿入

  • 共分散:x、yの相関

ここに画像の説明を挿入
-。共分散行列:これは3次元であり、次のプロジェクトで使用した2次元であることに注意してください。z値はありません。
ここに画像の説明を挿入

1. 原始数据处理:这里选取二维降一维进行展示,其中x,y是两个维度
ここに画像の説明を挿入
行代表了样例,列代表特征(TF-IDF)分别求x和y的平均值,然后对于所有的样例,都减去对应的均值。这里x的均值是1.81,y的均值是1.91,那么一个样例减去均值后即为(0.69,0.49)
ここに画像の説明を挿入
留一个思考1:为什么我们要减去均值,作用是什么?

2. 求协方差矩阵

我们上面协方差矩阵是二维的,所以是二行二列
ここに画像の説明を挿入
3.求协方差的特征值和特征向量

这边用到线性代数知识,不会的同学可以自行学习
下图第一个是特征值,第二个是特征向量(以下数字各位都是0省略不写了)
ここに画像の説明を挿入
特征值0.0490833989对应特征向量为第一条向量,这里的特征向量都归一化为单位向量。

4.选取最大k个特征值对应的特征向量(其中k是小于维度总数的一个值)
将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。这里特征值只有两个,我们选择其中最大的那个,这里是1.28402771,对应的特征向量是(-0.677873399, -0.735178656)T。我们是从二维降到一维,所以k取一,并且是最大的。
留两个思考题:

  • 思考二: 为什么要选择最大的k?依据是什么?
  • 思考三: k在实际运用中选取多少合适?

5.新しい行列を取得します
サンプルポイントを選択した特徴ベクトルに投影します。サンプル数をm、特徴数をnとすると、平均を差し引いた後のサンプル行列はDataAdjust(mn)であり、
共分散行列はnnであり、
選択されたk個の固有ベクトルはEigenVectors(nk)で構成されます。
次に、投影されたデータFinalDataはFinalData(101)
= DataAdjust(10 * 2マトリックス)x特徴ベクトル(-0.677873399、-0.735178656)T
です。得られた結果は、次の図の
ここに画像の説明を挿入
次元削減完了し、同時に忠実度が達成されます。検証用のPythonコードが不足しています。PCAを使用しないとどうなりますか


私たちは考えて答えます:なぜデータを平均から差し引くべきなのか

簡単に言えば、データを一元化して、過剰適合の可能性を減らします。理由を探求したい学生がいる場合は、付録1を参照してください。


2つの考えに答えます。なぜkの固有値が大きいほど良いのでしょうか。

最大分散理論:先行モデル結論:最高のk次元の特徴は、n次元のサンプルポイントがk次元に変換された後、各次元のサンプル分散が非常に大きくなることです。
どうして?
投影されたサンプルポイント間の分散が最大であるため(投影の絶対値の合計が最大であるとも言えます)、
2次元が1次元に縮小されます。分散が大きくない場合、主軸上の投影ポイントが重なり、情報の損失が大きくなります、そして欠けているベクトルは非常に重要です。下の写真4と5を見てください!(図4と5は、原点を通過し、データが中央に配置されています)図4の左半分は
、u> x、uが主ベクトルの場合に最適です。u上の点の投影は、uとuの直交ベクトルに関連していることがわかります。明らかに、図4の左側の投影面は右側よりも大きく、投影点間の分散が大きくなっています。図5は、図4の1つのポイントの詳細図です。
ここに画像の説明を挿入
ここに画像の説明を挿入
まとめましょう:

線形代数で固有値を無数に見つけました。n* n対称行列を分解すると、その固有値と固有ベクトルを見つけることができ、n個のn次元直交基底が生成されます。直交基底は固有値に対応します。次に、行列がこれらのN個の基底に射影されます。このとき、固有値の係数は、基底の行列の射影長を表します。
固有値が大きいほど、対応する固有ベクトルでの行列の分散が大きくなり、サンプル点がより離散的になり、区別しやすくなり、情報も多くなります。したがって、最大の固有値を持つ対応する固有ベクトルには、方向の情報が多く含まれます。少数の固有値が小さい場合は、その方向の情報がほとんどないことを意味し、対応する小さな固有値を削除できます。方向データは、特徴量が大きい方向に対応するデータのみを保持することで、データ量は削減されますが、有用な情報量は保持されます。PCAはこの原則です。


私たちは3つの考え方に答えます。n次元の中で最も適切な選択はkはいくつですか。
もちろん、得られるk(特徴ベクトル)が多いほど、kが大きいほど、エントロピーが大きくなり、サンプルの不確実性が大きくなり、実際のデータに近くなります。kが大きくなると、先ほど述べた次元削減効果が得られなくなります。したがって、これは
経験的な話です。いくつかの調査研究では、選択されたメインシャフトの全長が、すべてのメインシャフトの長さの合計の約85%を占めることが示されています。実際、これは一般的な説明にすぎません。具体的な選択は、実際の状況によって異なります。 。以下に示す式。注:nはサンプルの数、kは選択した次元です
ここに画像の説明を挿入

4.まとめ

ステップレビュー

  1. 平均を削除
  2. 共分散行列を計算する
  3. 共分散行列の固有値と固有ベクトルを計算する
  4. 固有値を大から小に並べ替えます
  5. 上位k個の特徴ベクトルを保持
  6. データをkベクトルコンポーネントの新しい空間に変換する
  7. n次元行列* k次元固有ベクトル= k次元行列

次元ダウンが完了!

付録1:
データの主成分を説明するために、データの次元削減から始めましょう。データの次元削減とは何ですか?3次元空間に一連の点があり、これらの点が原点を通る傾斜面に分布していると仮定します。このデータセットを表すために自然座標系x、y、zの3つの軸を使用する場合、3つの次元を使用する必要がありますが、実際には、これらの点の分布は2次元平面上にのみありますが、問題は何ですか?データが配置されている平面がx、y平面と一致するように、x、y、z座標系を回転します。回転した座標系がx '、y'、z 'とマークされている場合、このデータのグループはx'と二次元で表現できます!もちろん、元の表現を復元したい場合は、これら2つの座標間の変換行列を保存する必要があります。このようにして、データディメンションを削減できます。下の図を
ここに画像の説明を挿入
て、この箇所を理解してくださいただし、このプロセスの本質を理解する必要があります。これらのデータが行または列ごとにマトリックスに配置されている場合、マトリックスのランクは2です。これらのデータの間には相関関係があります(ゼロ以外のソリューションを使用)。これらのデータによって形成される原点と交差する最大の線形独立ベクトルのグループには2つのベクトルが含まれ、平面が原点と交差する必要があります!これがデータの一元化の理由です!座標の原点をデータセンターに移動し、元は関係のないデータがこの新しい座標系に関連するようにします。基底ベクトルの直交性を増やします。興味深いことに、3点は同一平面上にある必要があります。つまり、3次元空間内の任意の3点は、中央に配置された後、線形関係にあります。一般的に、n次元空間内のn点は、n-1次元部分空間内にある必要があります。分析中!共次元性がn次元ユークリッド空間の1に等しい線形部分空間は、(n-1)次元でなければなりません。これは、平面内の直線と空間内の平面の延長です。

付録2:Pythonコードとデータ

注:Pythonコードは、2次元空間でのPCA次元削減と非次元削減を使用した4次元データの比較を示しています。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt  #2D绘图库

#计算均值,要求输入数据为numpy的矩阵格式,行表示样本数,列表示特征
def meanX(dataX):
    return np.mean(dataX,axis=0)#axis=0表示按照列来求均值,如果输入list,则axis=1
def pca(XMat, k):
    average = meanX(XMat)
    m, n = np.shape(XMat)
    data_adjust = []
    avgs = np.tile(average, (m, 1))
    data_adjust = XMat - avgs
    covX = np.cov(data_adjust.T)   #计算协方差矩阵
    featValue, featVec=  np.linalg.eig(covX)  #求解协方差矩阵的特征值和特征向量
    index = np.argsort(-featValue) #按照featValue进行从大到小排序
    finalData = []
    if k > n:
        print ("k must lower than feature number")
        return
    else:
        #注意特征向量时列向量,而numpy的二维矩阵(数组)a[m][n]中,a[1]表示第1行值
        selectVec = np.matrix(featVec.T[index[:k]]) #所以这里需要进行转置
        finalData = data_adjust * selectVec.T
        reconData = (finalData * selectVec) + average
    return finalData, reconData
#输入文件的每行数据都以\t隔开
def loaddata(datafile):
    return np.array(pd.read_csv(datafile,sep=" ",header=-1)).astype(np.float)
def plotBestFit(data1, data2):
    dataArr1 = np.array(data1)
    dataArr2 = np.array(data2)

    m = np.shape(dataArr1)[0]
    axis_x1 = []
    axis_y1 = []
    axis_x2 = []
    axis_y2 = []
    for i in range(m):
        axis_x1.append(dataArr1[i,0])
        axis_y1.append(dataArr1[i,1])
        axis_x2.append(dataArr2[i,0])
        axis_y2.append(dataArr2[i,1])
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(axis_x1, axis_y1, s=50, c='red', marker='s')
    ax.scatter(axis_x2, axis_y2, s=50, c='blue')
    plt.xlabel('x1'); plt.ylabel('x2');
    plt.savefig("outfile.png")
    plt.show()
#根据数据集data.txt
def main():
    datafile = "data.txt"
    XMat = loaddata(datafile)
    k = 2
    return pca(XMat, k)
if __name__ == "__main__":
    finalData, reconMat = main()
    plotBestFit(finalData, reconMat)

データ:data.txtファイル、注:相対パスを使用し、データを.pyコードの同じレベルのディレクトリに配置し、並列関係

5.1 3.5 1.4 0.2
4.9 3.0 1.4 0.2
4.7 3.2 1.3 0.2
4.6 3.1 1.5 0.2
5.0 3.6 1.4 0.2
5.4 3.9 1.7 0.4
4.6 3.4 1.4 0.3
5.0 3.4 1.5 0.2
4.4 2.9 1.4 0.2
4.9 3.1 1.5 0.1
5.4 3.7 1.5 0.2
4.8 3.4 1.6 0.2
4.8 3.0 1.4 0.1
4.3 3.0 1.1 0.1
5.8 4.0 1.2 0.2
5.7 4.4 1.5 0.4
5.4 3.9 1.3 0.4
5.1 3.5 1.4 0.3
5.7 3.8 1.7 0.3
5.1 3.8 1.5 0.3
5.4 3.4 1.7 0.2
5.1 3.7 1.5 0.4
4.6 3.6 1.0 0.2
5.1 3.3 1.7 0.5
4.8 3.4 1.9 0.2
5.0 3.0 1.6 0.2
5.0 3.4 1.6 0.4
5.2 3.5 1.5 0.2
5.2 3.4 1.4 0.2
4.7 3.2 1.6 0.2
4.8 3.1 1.6 0.2

終わり!
参照ブログ1:https : //www.jianshu.com/p/f9c6b36395f6
参照ブログコード:https : //blog.csdn.net/Dream_angel_Z/article/details/50760130

おすすめ

転載: blog.csdn.net/qq_44112474/article/details/93908037