2011-08-14 29 views
6

Python'da dışbükey gövdenin en boy oranına yaklaşmanın en iyi yolu ne olurdu? Bunu, bir elips ile dışbükey gövdenin köşelerini takarak ve yarı-ana eksenin oranını alarak bunu yapmayı denedim. Sonuçlar tatmin edici değil, bu yüzden şimdi en boy oranını doğrudan dışbükey gövdeden türetmeye çalışıyorum. Herhangi bir fikir veya çözüm çok takdir edilecektir.Dışbükey gövdenin en boy oranının tahmin edilmesi

Alkış

+0

demek: rastgele noktalarda bir grup için bir örnek (sadece sadece köşeleri kullanarak, dışbükey gövde aynı şeyi uygulamak istiyorum) gibi

Bu bağlamda oran ve onu doğrudan dışbükey gövdeden nasıl elde etmek istiyorsunuz? –

+1

Dışbükey gövdenin en boy oranını nasıl tanımlarsınız? Farklı açılara izin vermek istiyor musunuz? Bu nedenle, döndürülen bir dikdörtgenin en boy oranını elde edebilirsiniz? Eksenler için sadece 0 ° ve 90 ° kullanmak istiyorsanız, en boy oranının hesaplanması kolaydır. –

+0

0 ile 90 derece arasında, aşağıdaki gibi temel en boy oranını bulmak mı istiyorsunuz? 1) Dışbükey gövdede ana ekseni bulun (merkezdeki dışbükey gövdede mümkün olan en uzun yol) ve 2) ana eksene dik olan minör ekseni ölçün. Bu durumda, o zaman çalışması gerekir. – ebressert

cevap

7

Genellikle, nokta bulutunun kovaryans matrisinin öz vektörlerini bulur. En/boy oranı, en büyükden en küçük öz değerlere oranıdır. Eğer yönü ile ne

import matplotlib.pyplot as plt 
import numpy as np 

# Random data 
num = 100 
xy = np.random.random((2,num)) + 0.01 * np.arange(num) 

eigvals, eigvecs = np.linalg.eig(np.cov(xy)) 

fig, (ax1, ax2) = plt.subplots(nrows=2) 
x,y = xy 
center = xy.mean(axis=-1) 
for ax in [ax1, ax2]: 
    ax.plot(x,y, 'ro') 
    ax.axis('equal') 

for val, vec in zip(eigvals, eigvecs.T): 
    val *= 2 
    x,y = np.vstack((center + val * vec, center, center - val * vec)).T 
    ax2.plot(x,y, 'b-', lw=3) 

plt.show() 

enter image description here

+0

Bu güzel bir çözümdür. Bu kodu verilerimde hala test ediyorum, ancak şu ana kadar sonuçlar iyi. Teşekkürler! – ebressert

İlgili konular