ฉันมีอาร์เรย์ numpy ที่มีคอลัมน์mและnแถวคอลัมน์ที่มีมิติและ datapoints แถว
ตอนนี้ฉันต้องคำนวณค่าเคอร์เนลสำหรับการรวมกันของจุดข้อมูล
สำหรับเคอร์เนลเชิงเส้นฉันทำได้ง่ายๆdot(X,X.T)
ฉันจะคำนวณค่าทั้งหมดสำหรับเคอร์เนล Gaussianอย่างมีประสิทธิภาพด้วยs ?
ฉันมีอาร์เรย์ numpy ที่มีคอลัมน์mและnแถวคอลัมน์ที่มีมิติและ datapoints แถว
ตอนนี้ฉันต้องคำนวณค่าเคอร์เนลสำหรับการรวมกันของจุดข้อมูล
สำหรับเคอร์เนลเชิงเส้นฉันทำได้ง่ายๆdot(X,X.T)
ฉันจะคำนวณค่าทั้งหมดสำหรับเคอร์เนล Gaussianอย่างมีประสิทธิภาพด้วยs ?
คำตอบ:
ฉันคิดว่าปัญหาหลักคือการได้รับระยะทางคู่ได้อย่างมีประสิทธิภาพ เมื่อคุณมีส่วนที่เหลือเป็นองค์ประกอบที่ชาญฉลาด
ในการทำเช่นนี้คุณอาจต้องการใช้สคิเปีย ฟังก์ชั่นscipy.spatial.distance.pdist
ทำในสิ่งที่คุณต้องการและscipy.spatial.distance.squareform
อาจจะทำให้ชีวิตของคุณง่ายขึ้น
ดังนั้นถ้าคุณต้องการเคอร์เนลเมทริกซ์ที่คุณทำ
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)
K = scipy.exp(-pairwise_dists**2 / s**2)
pdist
ง่ายมาก: มันเป็นแค่วง C-ดำเนินการโดยตรงคำนวณระยะทางในวิธีที่ชัดเจน , บ่วงถูกทำที่นี่ ; ไม่มี vectorization แฟนซีหรือสิ่งใดนอกเหนือจากสิ่งที่ผู้รวบรวมสามารถทำได้โดยอัตโนมัติ
ในฐานะที่เป็นภาคผนวกขนาดเล็กที่จะตอบ bayerj ของ SciPy ของฟังก์ชั่นได้โดยตรงสามารถคำนวณบรรทัดฐานยุคลิดสแควร์โดยเรียกมันว่าเป็นpdist
pdist(X, 'sqeuclidean')
รหัสเต็มสามารถเขียนได้อย่างมีประสิทธิภาพมากขึ้นเช่น
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')
ให้ซึ่งเหมือนกัน
คุณยังสามารถเขียนแบบตารางด้วยมือ:
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 แต่ใช้งานได้ช้าลง 30%
einsum
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)
ซึ่งเท่ากับ
clf=SVR(kernel="rbf",gamma=1)
คุณสามารถคำนวณ RBF ได้อย่างมีประสิทธิภาพจากหมายเหตุโค้ดด้านบนว่าค่าแกมม่าคือ 1 เนื่องจากมันเป็นค่าคงที่ s ที่คุณร้องขอนั้นก็เป็นค่าคงที่เดียวกัน
ฉันคิดว่านี่จะช่วย:
def GaussianKernel(v1, v2, sigma):
return exp(-norm(v1-v2, 2)**2/(2.*sigma**2))