Защо получавам тази грешка, докато изпълнявам метода 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. Precomputed е предназначен за ситуации, в които имате други персонализирани ядра - person StupidWolf; 09.02.2021
comment
вижте например това stackoverflow.com/questions/58197672/ - person StupidWolf; 09.02.2021
comment
Добре, благодаря за отделеното време. Сега разбрах - person Akhil Matcha; 10.02.2021