web-dev-qa-db-ja.com

scikitを使用して新しい値で逆変換を学習する方法

Scikit learn PCAを使用した一連のデータがあります。 StandardScaler()でPCAを実行する前に、データをスケーリングしました。

variance_to_retain = 0.99
np_scaled = StandardScaler().fit_transform(df_data)
pca = PCA(n_components=variance_to_retain)
np_pca = pca.fit_transform(np_scaled)

# make dataframe of scaled data
# put column names on scaled data for use later
df_scaled = pd.DataFrame(np_scaled, columns=df_data.columns)
num_components = len(pca.explained_variance_ratio_)
cum_variance_explained = np.cumsum(pca.explained_variance_ratio_)

eigenvalues = pca.explained_variance_
eigenvectors = pca.components_

次に、スケーリングされたデータセットに対してK平均クラスタリングを実行しました。スケーリングされたスペースでクラスターの中心をうまくプロットできます。

私の質問は、センターの場所を元のデータスペースに戻す方法を教えてください。 StandardScaler.fit_transform()を使用すると、データの平均と分散がゼロになることがわかっています。しかし、形状の新しいポイント(num_clusters、num_features)では、inverse_transform(centers)を使用して、元のデータの範囲とオフセットに変換された中心を取得できますか?

ありがとう、David

4
David McCormick

kmeansでcluster_centersを取得し、それをpca.inverse_transformにプッシュするだけです。

ここに例があります

_import numpy as np
from sklearn import decomposition
from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler



iris = datasets.load_iris()
X = iris.data
y = iris.target

scal = StandardScaler()
X_t = scal.fit_transform(X)

pca = decomposition.PCA(n_components=3)
pca.fit(X_t)
X_t = pca.transform(X_t)

clf = KMeans(n_clusters=3)
clf.fit(X_t)

scal.inverse_transform(pca.inverse_transform(clf.cluster_centers_))
_

Sklearnには、適合/変換を行う複数の方法があることに注意してください。 StandardScaler().fit_transform(X)は実行できますが、スケーラーが失われ、再利用できません。また、それを使用して逆を作成することもできません。

または、scal = StandardScaler()に続けてscal.fit(X)を実行し、次にscal.transform(X)を実行することもできます。

または、フィット/変換ステップを組み合わせたscal.fit_transform(X)を実行できます

5
Mohammad Athar