M sütunları ve n satırları olan sütunları ve satırları veri noktaları olan bir numpy dizi var .
Şimdi her veri noktası kombinasyonu için çekirdek değerlerini hesaplamam gerekiyor.
Doğrusal bir çekirdek için Sadece yapabilirdot(X,X.T)
M sütunları ve n satırları olan sütunları ve satırları veri noktaları olan bir numpy dizi var .
Şimdi her veri noktası kombinasyonu için çekirdek değerlerini hesaplamam gerekiyor.
Doğrusal bir çekirdek için Sadece yapabilirdot(X,X.T)
Yanıtlar:
Bence asıl sorun çift mesafeleri verimli bir şekilde elde etmektir. Bir kez sen-si olmak kalan gerisi element akıllıca.
Bunu yapmak için muhtemelen scipy kullanmak istiyorsunuz. İşlev scipy.spatial.distance.pdist
ihtiyacınız olanı yapar vescipy.spatial.distance.squareform
muhtemelen hayatınızı kolaylaştıracaktır.
Eğer çekirdek matrisini istiyorsanız
from scipy.spatial.distance import pdist, squareform
# this is an NxD matrix, where N is number of items and D its dimensionalites
X = loaddata()
pairwise_dists = squareform(pdist(X, 'euclidean'))
K = scip.exp(-pairwise_dists ** 2 / s ** 2)
Belgeleri burada bulabilirsiniz .
K = scipy.exp(-pairwise_dists**2 / s**2)
pdist
çok basittir: sadece mesafeleri doğrudan açık bir şekilde hesaplayan C tarafından uygulanan bir döngü , döngü burada yapılır ; hiçbir süslü vectorizasyon veya derleyicinin otomatik olarak başarabileceği her şeyin ötesinde bir şey.
Bayerj'in cevabına küçük bir ek olarak scipy'nin pdist
fonksiyonu, kare öklidik normları doğrudan olarak adlandırarak hesaplayabilir pdist(X, 'sqeuclidean')
. Tam kod daha sonra daha verimli bir şekilde yazılabilir.
from scipy.spatial.distance import pdist, squareform
# this is an NxD matrix, where N is number of items and D its dimensionalites
X = loaddata()
pairwise_sq_dists = squareform(pdist(X, 'sqeuclidean'))
K = scip.exp(-pairwise_sq_dists / s**2)
pairwise_sq_dists = cdist(X, X, 'sqeuclidean')
aynı şeyi verir.
Kare formunu elle de yazabilirsiniz:
import numpy as np
def vectorized_RBF_kernel(X, sigma):
# % This is equivalent to computing the kernel on every pair of examples
X2 = np.sum(np.multiply(X, X), 1) # sum colums of the matrix
K0 = X2 + X2.T - 2 * X * X.T
K = np.power(np.exp(-1.0 / sigma**2), K0)
return K
PS ama bu% 30 daha yavaş çalışıyor
einsum
çağrı şunlara ait X2
.
def my_kernel(X,Y):
K = np.zeros((X.shape[0],Y.shape[0]))
for i,x in enumerate(X):
for j,y in enumerate(Y):
K[i,j] = np.exp(-1*np.linalg.norm(x-y)**2)
return K
clf=SVR(kernel=my_kernel)
bu eşittir
clf=SVR(kernel="rbf",gamma=1)
Yukarıdaki kod notundan RBF'yi etkili bir şekilde hesaplayabilirsiniz.
Bunun yardımcı olacağını düşünüyorum:
def GaussianKernel(v1, v2, sigma):
return exp(-norm(v1-v2, 2)**2/(2.*sigma**2))