Почему я получаю эту ошибку при выполнении метода KernalPCA, присутствующего в модуле декомпозиции sklearn

Я пробовал Kernal PCA, используя библиотеку sklearn на наборе данных о сердечных заболеваниях от kaggle (https://www.kaggle.com/ronitf/heart-disease-uci) Итак, я создал список всех типов ядер в списке 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

Это был фрагмент ошибки при выполнении вышеуказанного кода


person Akhil Matcha    schedule 04.02.2021    source источник


Ответы (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', тогда вам необходимо предоставить матрицу граммов, см. этот ответ, например, если мы предварительно вычислим матрицу грамма с линейным ядром:

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]])
person StupidWolf    schedule 06.02.2021
comment
Спасибо за ответ, он был ясным, но не могли бы вы сказать разницу между другими ядрами по сравнению с предварительно вычисленными? - person Akhil Matcha; 09.02.2021
comment
извините, я не совсем понял ваш вопрос. если вы выбираете предварительное вычисление, вы должны предоставить преобразованную матрицу, поэтому вы выбираете собственное ядро, в моем примере выше я использовал линейное ядро, которое даст вам тот же результат, если вы используете kernel = linear. Предварительное вычисление предназначено для ситуаций, когда у вас есть другие настраиваемые ядра. - person StupidWolf; 09.02.2021
comment
см., например, этот stackoverflow.com/questions/58197672/ - person StupidWolf; 09.02.2021
comment
Хорошо, спасибо за ваше время. Теперь я понял. - person Akhil Matcha; 10.02.2021