次の方法で値が分散されているnumpy配列があります
この配列から、正規分布するランダムなサブサンプルを取得する必要があります。
写真の赤い線の上にある配列から値を取り除く必要があります。つまり、突然のピークが削除されたときに分布が滑らかになるように、配列から特定の値の出現を取り除く必要があります。
これは、ピークに対応するエントリを手動で探してそれらのいくつかの出現を削除せずに、python で達成できますか? これをもっと簡単な方法で行うことはできますか?
次の方法で値が分散されているnumpy配列があります
この配列から、正規分布するランダムなサブサンプルを取得する必要があります。
写真の赤い線の上にある配列から値を取り除く必要があります。つまり、突然のピークが削除されたときに分布が滑らかになるように、配列から特定の値の出現を取り除く必要があります。
これは、ピークに対応するエントリを手動で探してそれらのいくつかの出現を削除せずに、python で達成できますか? これをもっと簡単な方法で行うことはできますか?
これは、サンプルを並べ替え、均一に変換してから、通常のグリッド サブサンプルを選択しようとすることで機能します。攻撃的すぎると感じた場合ns
は、基本的に保持されるサンプルの数を増やすことができます。
また、真のディストリビューションの知識が必要ですのでご注意ください。正規分布の場合、標本平均と偏りのない分散推定 (n-1 のもの) を使用しても問題ありません。
コード (プロットなし):
import scipy.stats as ss
import numpy as np
a = ss.norm.rvs(size=1000)
b = ss.uniform.rvs(size=1000)<0.4
a[b] += 0.1*np.sin(10*a[b])
def smooth(a, gran=25):
o = np.argsort(a)
s = ss.norm.cdf(a[o])
ns = int(gran / np.max(s[gran:] - s[:-gran]))
grid, dp = np.linspace(0, 1, ns, endpoint=False, retstep=True)
grid += dp/2
idx = np.searchsorted(s, grid)
c = np.flatnonzero(idx[1:] <= idx[:-1])
while c.size > 0:
idx[c+1] = idx[c] + 1
c = np.flatnonzero(idx[1:] <= idx[:-1])
idx = idx[:np.searchsorted(idx, len(a))]
return o[idx]
ap = a[smooth(a)]
c, b = np.histogram(a, 40)
cp, _ = np.histogram(ap, b)