কীভাবে কোনও গাউসিয়ান কার্নেলকে নাম্পি [বন্ধ] কার্যকরভাবে গণনা করতে হবে


12

আমার কাছে এম কলাম এবং এন সারি, একটি কলাম স্তরের মাত্রা এবং সারিগুলির ডেটাপয়েন্ট রয়েছে তার সাথে একটি অলস অ্যারে রয়েছে ।

ডেটা পয়েন্টের প্রতিটি সংমিশ্রণের জন্য আমার এখন কার্নেল মান গণনা করতে হবে।

লিনিয়ার কার্নেলের জন্য কেবল আমি করতে পারিK(xi,xj)=xi,xjdot(X,X.T)

গসিয়ান কার্নেল জন্য আমি কীভাবে কার্যকরভাবে সমস্ত মান গণনা করতে পারি প্রদত্ত এস সহ ?K(xi,xj)=expxixj22s2


1
ভাল, আপনি যদি কম্পিউটারে দু'টি বৃদ্ধির ফ্যাক্টরটির বিষয়ে খুব বেশি চিন্তা না করেন তবে আপনি সর্বদা এবং তারপরে যেখানে অবশ্যই, the উপাদান । এটি সম্ভবত হয় না অধিকাংশ সংখ্যাসূচকভাবে স্থিতিশীল, যদিও, হয়। S=XXTK(xi,xj)=exp((Sii+Sjj2Sij)/s2)Sij(i,j)S
কার্ডিনাল

2
(কয়েক বছর পর) বৃহৎ বিক্ষিপ্ত অ্যারে জন্য, দেখুন sklearn.metrics.pairwise.pairwise_distances.html মধ্যে scikit-শিখতে।
অস্বীকার

উত্তর:


26

আমি মনে করি মূল সমস্যাটি দক্ষতার সাথে জোড়া লাগানোর দূরত্ব পাওয়া। একবার আপনার কাছে এলো যে বাকী উপাদানটি বুদ্ধিমান।

এটি করার জন্য, আপনি সম্ভবত স্কিপি ব্যবহার করতে চান। ফাংশনটি 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)

ডকুমেন্টেশন এখানে পাওয়া যাবে । 


3
আমার কাছে মনে হয় বৈয়ারের উত্তরে সূত্রে ফিট করার জন্য কিছুটা ছোট পরিবর্তন প্রয়োজন, যদি কারও কারওর প্রয়োজন হয়:K = scipy.exp(-pairwise_dists**2 / s**2)
ক্লো

কেউ যদি জানতে আগ্রহী হয়, দ্বারা ব্যবহৃত আলগোরিদিম pdistখুবই সহজ: এটা শুধু একটা সি-বাস্তবায়িত লুপ যে সরাসরি দূরত্বের নির্ণয় এর সুস্পষ্ট পথ , লুপিং করা হচ্ছে এখানে ; কোনও অভিনব ভেক্টরাইজেশন বা সংকলক স্বয়ংক্রিয়ভাবে সম্পন্ন করতে পারে তার বাইরে কিছু নেই।
ডুগল

11

বায়ারজের উত্তরের একটি ছোট সংযোজন হিসাবে, স্কিপির 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)

1
বা কেবল pairwise_sq_dists = cdist(X, X, 'sqeuclidean')যা একই দেয়।
ব্যবহারকারী 1721713

5

আপনি হাতে হাতে স্কোয়ার ফর্মও লিখতে পারেন:

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

পিএস তবে এটি 30% ধীর কাজ করে


এটি, যা মন্তব্যে কার্ডিনাল দ্বারা প্রস্তাবিত পদ্ধতি, ইনপ্লেস ক্রিয়াকলাপগুলি ব্যবহার করে কিছুটা বাড়িয়ে দেওয়া যেতে পারে। এটি আপনার জন্য একটি কল সহ বিজ্ঞান-শিখুন কীভাবে তা করেeinsumX2
ডুগল

4
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)

আপনি উপরের কোড নোট থেকে আরবিএফকে কার্যকরভাবে গণনা করতে পারেন যে গামার মানটি 1, যেহেতু এটি যে ধ্রুবক হিসাবে আপনি অনুরোধ করেছেন সেটিও একই ধ্রুবক।


আমাদের সাইটে আপনাকে স্বাগতম! স্ট্যাক ওভারফ্লোতে আমাদের কিছুটা আলাদা জোর রয়েছে, এতে সাধারণত আমাদের কোডের দিকে কম মনোনিবেশ করা হয় এবং অন্তর্নিহিত ধারণাগুলির প্রতি আরও বেশি কিছু থাকে, তাই আপনার কোডটি বর্ননা করা বা এর মূল ধারণাগুলি কী তা সম্পর্কে একটি সংক্ষিপ্ত ধারণা দেওয়া মূল্যবান হতে পারে যেমন কয়েকটি অন্যান্য উত্তরগুলি করেছেন। এটি আপনার উত্তর কীভাবে অন্যদের থেকে পৃথক হয় তা ব্যাখ্যা করতে সহায়তা করবে।
সিলভারফিশ

এটি অন্যান্য উত্তরের তুলনায় অনেক ধীর হবে কারণ এটি ভেক্টরাইজেশনের পরিবর্তে পাইথন লুপ ব্যবহার করে।
ডুগল

-1

আমি মনে করি এটি সাহায্য করবে:

def GaussianKernel(v1, v2, sigma):
    return exp(-norm(v1-v2, 2)**2/(2.*sigma**2))

3
@ কার্নেল সাইটটিতে আপনাকে স্বাগতম। আপনি চিহ্নটির মধ্যে এক্সপ্রেশন রেখে সিনট্যাক্সের মতো লেটেক্স ব্যবহার করে গণিত প্রদর্শন করতে পারেন। এবং আপনি 4 স্পেস দ্বারা লাইন ইনডেন্ট করে কোডটি (সিনট্যাক্স হাইলাইটিং সহ) প্রদর্শন করতে পারেন। Markdown সম্পাদনা দেখুন সাহায্যের নির্দেশিকা বিন্যাস জন্য, এবং অনবরত জিজ্ঞাসিত প্রশ্ন আরও সাধারণ বেশী জন্য।
এন্টোইন ভার্নেট

1
এটি কি প্রশ্নের মধ্যে প্রতিধ্বনিত হয় না?
হোয়বার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.