Python'daki bir dağıtım işlevinden örnek

Sep 11 2020

Bir dizim var.

array([1,1,1,1,1,
1,1,1,0.96227599,0,
0,1,1,1,1,
0,0,1,0,0,
1,1,1,0,1,
1,1,0,1,0,
0,1,0,0,1,
0,0,1,1,1,
1,1,0,1,1,
1,1,1,1,1,
1,1,1,1,1,
1,1,0,0,0,
1,0,1,1,1,
1,1,1,1,1,
1,1,1,1,1,
0.94795539,0.85308765,0,0,1,
1,1,0.9113806,1,1,
1,1,1,1,1,
1,0,1,1,0,
1,1,1,1,1,
1,1,0.20363486,0.50635838,0.52025932,
0,0.34747655,0.50147493,0,0.4848249,
0,0.88495575,0,0.27620151,0.3981369,
0,0,0])

Değerler 0 ile 1 arasındadır. Bir olasılık dağılımı fonksiyonunu nasıl çizebilirim? Ve sonra, her satırın 5 sütun içerdiği 1000 satırlık bir tabloyu doldurun. Aslında, tabloyu 5 değerden oluşan örneklerle doldurun:

Yanıtlar

1 scleronomic Sep 11 2020 at 17:44

pdfÖrneklerinizden bir almak için bir kernel density estimator. Bir seçenek gaussian_kdeformdur scipy.stats.

Otomatik bant genişliği belirlemeyi içerir. Tahmin, tek modlu dağılım için en iyi sonucu verir; iki modlu veya çok modlu dağılımlar aşırı düzleme eğilimindedir.

Örnekleriniz, 0 ve 1'deki kümelerle güçlü bir şekilde çift modelli görünür, bu nedenle sklearns kullanmanız daha iyi tavsiye edilebilir KernelDensity. Burada spesifik üzerinde daha fazla kontrole sahip algorithm, kernelve bandwidth. Sklearn ayrıca Yoğunluk Tahminine bir giriş yapmıştır

Her iki yöntemle iş akışı oldukça benzerdir:

import numpy as np
from scipy import stats
from sklearn.neighbors import KernelDensity
import matplotlib.pyplot as plt

a = np.array([1,1,1,1,1,1,1,1,0.96227599,0,0,1,1,1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,1,0,0,1,0,0,1,1,1,1,1,0,1,1,1,1,1,
              1,1,1,1,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0.94795539,0.85308765,0,0,1,1,1,0.9113806,1,1,1,1,
              1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0.20363486,0.50635838,0.52025932,0,0.34747655,0.50147493,0,0.4848249,0,
              0.88495575,0,0.27620151,0.3981369,0,0,0])

kde1 = stats.gaussian_kde(a)
x1 = np.linspace(0, 1, 100)
y1 = kde1.pdf(x1)

kde2 = KernelDensity(bandwidth=0.1).fit(a.reshape(-1, 1))
y2 = kde2.sample(10000)

kde3 = KernelDensity(bandwidth=0.01).fit(a.reshape(-1, 1))
y3 = kde3.sample(10000)

fig, ax = plt.subplots()
ax.plot(x1, y1, c='b')
ax.hist(y2.ravel(), bins=100, density=True, color='r', alpha=0.7)
ax.hist(y3.ravel(), bins=100, density=True, color='m', alpha=0.7)

Bu yöntemin pdf'nizi [0, 1] arasındaki değerlerle sınırlamadığını unutmayın. Bunu kendiniz halletmelisiniz, yani ikinci bir adımda bunları filtreleyerek. Bununla birlikte, küçük bir bant genişliği seçerseniz, oldukça yaklaşırsınız.


Sorunuzun ikinci bölümünü tam olarak anlamadım. Tahmini dağılımdan yeni örnekler almak istiyorsanız, bunu kde.sample()(sklearn) / kde.resample()( scipy) aracılığıyla yapabilirsiniz . Ve bu değerleri bir tabloya doldurmak, cevaplarını kesinlikle burada StackOverflow'da bulacağınız farklı bir sorudur.