अजगर में वॉन मिल्स-फिशर वितरण से नमूनाकरण?


14

मैं पाइथन में एक मल्टीवेरेट वॉन मिसेस-फिशर वितरण से नमूना लेने का एक सरल तरीका ढूंढ रहा हूं । मैं ध्यान दिया है में आँकड़े scipy में मॉड्यूल और numpy मॉड्यूल लेकिन केवल univariate वॉन मिसेस वितरण पाया। क्या कोई कोड उपलब्ध है? मुझे अभी तक नहीं मिला है।

जाहिरा तौर पर, वुड (1994) ने इस लिंक के अनुसार vMF वितरण से नमूने के लिए एक एल्गोरिथ्म तैयार किया है , लेकिन मैं कागज नहीं ढूंढ सकता।

- संपादित करें परिशुद्धता के लिए, मुझे एल्गोरिथ्म में दिलचस्पी है जो साहित्य में ढूंढना मुश्किल है (अधिकांश कागजात पर ध्यान केंद्रित करते हैं )। सेमिनल आर्टिकल (वुड, 1994) मेरे ज्ञान के लिए मुफ्त में नहीं मिल सकता है।S2


1
इनपुट को scipy.stats.vonmisesसरणी की तरह किया जा सकता है, इसलिए आप वितरण को एक के रूप में निर्दिष्ट कर सकते हैं array। इस उदाहरण को
अधिकारिक

आपके उत्तर के लिए धन्यवाद। लेकिन, ऐसा लगता है कि यह वास्तविक nD वॉन Mises-Fisher की तुलना में 1-D वॉन Mises का अधिक उत्पाद है K = vonmises.pdf([x,x], kappa=[[1],[10]]):। एक 2-डी vmf केवल एक वास्तविक होना चाहिए पैरामीटर के रूप में। क्या आप सहमत हैं? κ
माइक

मैं एल्गोरिथ्म वीएम * मूल रूप से वॉन मिसेस फिशर वितरण (वुड, 1994) के सिमुलेशन में देख रहा हूं। किसी को?
माइक

3
मुझे इस धागे के उत्तर यहां बहुत उपयोगी लगे। मैंने इस पैकेज के हिस्से के रूप में इसे करने के लिए थोड़ा साफ किया हुआ उपयोगिता फ़ंक्शन प्रदान किया है: https://github.com/clara-labs/spherecluster/blob/develop/spherecluster/util.py , जो अभी भी इसे बनाना चाहते हैं। डेटा।
Jaska

जवाबों:


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समान रूप से हाइपरस्फेयर पर नमूना है।v1-w2+wμwv

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) अपना उत्तर साझा करने के लिए धन्यवाद (विशेष रूप से शुरू में आपके प्रश्न के संभावित हतोत्साहित होने के बावजूद)!
whuber

4

(मैं यहाँ प्रारूपण के लिए माफी माँगता हूँ, मैंने इस प्रश्न का उत्तर देने के लिए सिर्फ एक खाता बनाया है, क्योंकि मैं भी हाल ही में यह जानने की कोशिश कर रहा था)।

माइक का उत्तर बहुत सही नहीं है, वेक्टर v से आने की जरूरत है एसपी-2 स्पर्शरेखा स्थान में μ, अर्थात्, v एक इकाई वेक्टर ऑर्थोगोनल होना चाहिए μ। अन्यथा, वेक्टरv1-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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.