【问题标题】:Why I'm getting this error while executing KernalPCA method present in decomposition module of sklearn为什么在执行 sklearn 分解模块中存在的 KernalPCA 方法时出现此错误
【发布时间】:2021-05-09 02:27:21
【问题描述】:

我在 kaggle (https://www.kaggle.com/ronitf/heart-disease-uci) 的心脏病数据集上使用 sklearn 库尝试了 Kernal PCA,因此,我创建了列表“P”中所有类型的内核的列表,并传递给 KernalPCA() 方法参数内核。

当我执行下面的代码时,我会在代码后面附加此错误消息。

情节的输出完全没问题,但我得到了错误

我很好奇为什么?有人可以帮忙吗?

from sklearn import decomposition
from sklearn.preprocessing import StandardScaler
from scipy import sparse
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import seaborn as sns
df = pd.read_csv('heart.csv')
target = df['target']
df.head()
Scaler = StandardScaler()
# X represents Standardized data of df
X = Scaler.fit_transform(df)
X.shape
n=2
p = ['linear','poly','rbf','sigmoid','cosine','precomputed']
for i in p:
    trans = decomposition.KernelPCA(n_components=n,kernel=i)
    Xli = trans.fit_transform(X)
    y = pd.DataFrame(Xli,columns=('PC1','PC2'))
    y['Target'] = target

【问题讨论】:

    标签: python machine-learning scikit-learn pca


    【解决方案1】:

    它在您最后选择的内核上失败。这很好用:

    np.random.seed(111)
    X = np.random.uniform(0,1,(10,4))
    target = np.random.normal(0,1,10)
    
    p = ['linear','poly','rbf','sigmoid','cosine']
    for i in p:
        trans = decomposition.KernelPCA(n_components=n,kernel=i)
        Xli = trans.fit_transform(X)
        y = pd.DataFrame(Xli,columns=('PC1','PC2'))
        y['Target'] = target
    

    如果你指定kernel = 'precomputed',那么你需要提供克矩阵,参见this answer,例如如果我们用线性核预先计算克矩阵:

    def linear_kernel(X, Y):
        return X.dot(Y.T)
    
    gram = linear_kernel(X, X)
    trans = decomposition.KernelPCA(n_components=n,kernel="precomputed")
    trans.fit_transform(gram)
    
    array([[ 0.34115243,  0.08282281],
           [ 0.34927523, -0.51709   ],
           [-0.48173365, -0.05455087],
           [-0.34252946, -0.21207875],
           [ 0.66528647, -0.12052876],
           [ 0.04018184,  0.71760041],
           [-0.35535148, -0.2107046 ],
           [ 0.04163704,  0.16239367],
           [-0.48902704,  0.01668406],
           [ 0.23110862,  0.13545204]])
    

    比较:

    trans = decomposition.KernelPCA(n_components=n,kernel="linear")
    trans.fit_transform(X)
    
    array([[ 0.34115243,  0.08282281],
           [ 0.34927523, -0.51709   ],
           [-0.48173365, -0.05455087],
           [-0.34252946, -0.21207875],
           [ 0.66528647, -0.12052876],
           [ 0.04018184,  0.71760041],
           [-0.35535148, -0.2107046 ],
           [ 0.04163704,  0.16239367],
           [-0.48902704,  0.01668406],
           [ 0.23110862,  0.13545204]])
    

    【讨论】:

    • 谢谢你的回答很清楚,但是你能告诉我与预计算相比其他内核之间的区别吗?
    • 对不起,我不太明白你的问题。如果您选择预计算,则必须提供转换后的矩阵,因此您选择自己的内核,在我上面的示例中,我使用了线性内核,如果您使用 kernel="linear",它将给您相同的结果。预计算适用于您有其他自定义内核的情况
    • 好的,谢谢你的时间,我知道了
    猜你喜欢
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2017-08-08
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多