趣味の研究

趣味の数学を公開しています。初めての方はaboutをご覧ください。

チェビシェフ不等式の拡張(続き)

正規分布に対して、以前の記事で導いた不等式と、今回導いたlog凹関数版の不等式を比較してみます。

 

f:id:hobbymath:20180331223550p:plain

"1-CDF"が実際の正規分布の値、"New bound1"がr=3で計算した値、"New bound2(log-concavity)"がlog凹関数版の不等式でr=1で計算した値です。

log凹関数版の不等式は、kが大きいところでは、rの値を0に近づけた方が近似精度が高くなります。

一方で、kが小さいところでの精度は悪化します。

計算に用いたpythonのコードです。

 

# -*- coding: utf-8 -*-
"""
Created on Fri Mar 30 22:52:40 2018
@author: HobbyMath
"""
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

k_max =50
sigma=1
mu=1
cdf = np.ones(k_max , dtype=float)
chebyshev= np.ones(k_max , dtype=float)
bound= np.ones(k_max , dtype=float)
bound2= np.ones(k_max , dtype=float)
bound3= np.ones(k_max , dtype=float)
for i in range(1,k_max + 1):
print(i)
delta = 0.1
k = i * delta + 1
##########normal distribution######

pos = k * sigma + mu
m = stats.norm.pdf(x=pos, loc=mu, scale=sigma)
cdf[i] = stats.norm.cdf(x=pos, loc=mu, scale=sigma)

chebyshev[i] = 1 / k**2

r = 3
bound[i]=(2 * m*sigma * k**3/ (2*r-1) ) **(1/(r+1)) / k**2

# r = 0.5
# bound2[i]=(2*m*sigma * k**3/ (k**2 * 0.5 + 2*r-1) ) **(1/(r+1)) / k**2
#
r = 1
bound2[i]=(2*m*sigma * k**3/ (k**2 * 0.5 + 2*r-1) ) **(1/(r+1)) / k**2
#bound[i]=(m*sigma * k**3/ (k + 2*r-1) ) **(1/(r+1)) / k**2


plt.title("normal distribution(mu=1, sigma=1)")
plt.ylabel("probability")
plt.xlabel("k")
#plt.yscale('log')

prange = np.arange(1 ,k_max)
x = prange.astype(np.float64) * delta + 1.0

p1 = plt.plot(x, 2 * (1-cdf[prange]))
#p2 = plt.plot(x, chebyshev[prange])

p2 = plt.plot(x, bound[prange])
p3 = plt.plot(x, bound2[prange])
#p4 = plt.plot(x, bound3[prange])
plt.legend((p1[0], p2[0], p3[0]), ("1-CDF", "New bound1(r=3)", "New bound2(log-concavtiy r=1)"), loc=5)