如何使用 scikit learn inverse_transform 和新值

问题描述 投票:0回答:2

我有一组数据,是我用过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) 将中心转换回原始数据的范围和偏移吗?

谢谢大卫

python scikit-learn pca
2个回答
8
投票

您可以在

cluster_centers
上获取
kmeans
,然后将其推入您的
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)
,它结合了拟合/变换步骤


1
投票

这里我使用 SVR 来拟合数据,然后我使用缩放技术来缩放值并获得我使用逆变换函数的预测

from sklearn.preprocessing import StandardScaler  

#Creating two objects for dependent and independent variable 
ss_X = StandardScaler()
ss_y = StandardScaler()

X = ss_X.fit_transform(X)
y = ss_y.fit_transform(y.reshape(-1,1))

#Creating a model object and fiting the data
reg = SVR(kernel='rbf')
reg.fit(X,y)

#To make a prediction
#First we have transform the value into scalar level
#Second inverse tranform the value to see the original value
ss_y.inverse_transform(reg.predict(ss_X.transform(np.array([[6.5]]))))
© www.soinside.com 2019 - 2024. All rights reserved.