পাইথনে ভন মাইজস-ফিশার বিতরণ থেকে নমুনা?


14

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

স্পষ্টতই, উড (1994) এই লিঙ্কটি অনুসারে ভিএমএফ বিতরণ থেকে স্যাম্পলিংয়ের জন্য একটি অ্যালগরিদম তৈরি করেছে , তবে আমি কাগজটি খুঁজে পাচ্ছি না।

- সম্পাদনা নির্ভুলতার জন্য, আমি সেই অ্যালগরিদম দ্বারা আগ্রহী যা সাহিত্যে খুঁজে পাওয়া শক্ত (বেশিরভাগ পেপার তে ফোকাস করে )। সেমিনাল নিবন্ধ (উড, 1994) আমার জ্ঞানের নিখরচায় পাওয়া যাবে না।S2


1
ইনপুটটি scipy.stats.vonmisesঅ্যারের মতো হতে পারে, তাই আপনি ডিস্ট্রিবিউশনটিকে একটি হিসাবে নির্দিষ্ট করতে পারেন array। এই উদাহরণটি
52

আপনার উত্তরের জন্য ধন্যবাদ. তবে, মনে হচ্ছে এটি একটি বাস্তব এনডি ভন মাইজেস-ফিশারের চেয়ে 1-ডি ভন মাইজির বেশি পণ্য K = vonmises.pdf([x,x], kappa=[[1],[10]])। একটি 2-D: vMF শুধুমাত্র একটি বাস্তব থাকা উচিত প্যারামিটার হিসাবে। তুমি কি একমত? κ
mic

আমি মূলত ভন মাইস ফিশার বিতরণ সারণীকরণ (কাঠ, 1994) এর অ্যালগরিদম ভিএম * খুঁজছি। যে কেউ?
mic

3
আমি এই থ্রেডের উত্তরগুলি এখানে সত্যিই দরকারী বলে খুঁজে পেয়েছি। এই প্যাকেজের অংশ হিসাবে এটি করার জন্য আমি কিছুটা সাফ ইউটিলিটি ফাংশন সরবরাহ করেছি: https://github.com/clara-labs/spherecluster/blob/develop/spherecluster/util.py , যারা এখনও এটি তৈরি করতে চাইছেন তাদের জন্য ডেটা।
জেসকা

উত্তর:


11

অবশেষে আমি এটি পেয়েছি. আমার উত্তর এখানে।

অবশেষে আমি দিকনির্দেশক পরিসংখ্যানগুলিতে (মার্ডিয়া এবং জুপ, 1999) এবং স্যাম্পলিংয়ের জন্য উলরিচ-উডের অ্যালগরিদমে হাত রেখেছি। আমি এটি থেকে কী বুঝলাম তা এখানে পোস্ট করি, অর্থাত আমার কোড (পাইথনে)।

প্রত্যাখ্যান নমুনা প্রকল্প:

def rW(n, kappa, m):
    dim = m-1
    b = dim / (np.sqrt(4*kappa*kappa + dim*dim) + 2*kappa)
    x = (1-b) / (1+b)
    c = kappa*x + dim*np.log(1-x*x)

    y = []
    for i in range(0,n):
        done = False
        while not done:
            z = sc.stats.beta.rvs(dim/2,dim/2)
            w = (1 - (1+b)*z) / (1 - (1-b)*z)
            u = sc.stats.uniform.rvs()
            if kappa*w + dim*np.log(1-x*w) - c >= np.log(u):
                done = True
        y.append(w)
    return y

তারপরে, পছন্দসই নমুনাটি v is, যেখানেডাবলপ্রত্যাখ্যান স্যাম্পলিং স্কিমের ফলাফল এবংভিএকইভাবে হাইপারস্পিয়ারের উপর নমুনাযুক্ত।বনাম1-W2+ +WμWবনাম

def rvMF(n,theta):
    dim = len(theta)
    kappa = np.linalg.norm(theta)
    mu = theta / kappa

    result = []
    for sample in range(0,n):
        w = rW(n, kappa, dim)
        v = np.random.randn(dim)
        v = v / np.linalg.norm(v)

        result.append(np.sqrt(1-w**2)*v + w*mu)

    return result

এবং কার্যকরভাবে এই কোডটি সহ নমুনা দেওয়ার জন্য, এখানে একটি উদাহরণ:

import numpy as np
import scipy as sc
import scipy.stats

n = 10
kappa = 100000
direction = np.array([1,-1,1])
direction = direction / np.linalg.norm(direction)

res_sampling = rvMF(n, kappa * direction)

3
(+1) আপনার উত্তর ভাগ করে নেওয়ার জন্য ধন্যবাদ (বিশেষত আপনার প্রশ্নটি বন্ধ করার সম্ভাব্য নিরুৎসাহ সত্ত্বেও)!
হোবার

4

(আমি এখানে ফর্ম্যাটিংয়ের জন্য ক্ষমাপ্রার্থী, আমি এই প্রশ্নের উত্তর দেওয়ার জন্য একটি অ্যাকাউন্ট তৈরি করেছি, যেহেতু আমি সম্প্রতি এটিও বের করার চেষ্টা করছিলাম)।

বনামএসপি-2μবনামμবনাম1-W2+ +Wμএকটি আদর্শ হবে না। আপনি এটি মাইকের দ্বারা সরবরাহিত উদাহরণে দেখতে পারেন। এটি ঠিক করতে, এমন কিছু ব্যবহার করুন:

import scipy.linalg as la
def sample_tangent_unit(mu):
    mat = np.matrix(mu)

    if mat.shape[1]>mat.shape[0]:
        mat = mat.T

    U,_,_ = la.svd(mat)
    nu = np.matrix(np.random.randn(mat.shape[0])).T
    x = np.dot(U[:,1:],nu[1:,:])
    return x/la.norm(x)

এবং প্রতিস্থাপন

v = np.random.randn(dim)
v = v / np.linalg.norm(v)

একটি কল সঙ্গে মাইকের উদাহরণে

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