密度比估算的python包
densratio的Python项目详细描述
密度比估计描述如下:对于给定的两个数据
样本x1
和x2
来自未知分布p(x)
和q(x)
分别估计w(x)=p(x)/q(x)
,其中x1
和x2
是
三维实数。
估计密度比函数w(x)
可用于
应用程序,例如基于内联的异常值检测[1]和
协变量移位适应[2]。密度的其他有用应用
Sugiyama等人总结了比率估计。(2012)在[3]中。
包densratio提供一个函数densratio()
返回
一种具有估计密度比的方法的物体
compute_density_ratio()
此外,α相对密度比p(x)/(α*p(x)+(1-α)*q(x))
(其中α在[0,1]范围内)也可以是
估计。当alpha为0时,这将减少为普通密度比
w(x)
。α相对pe散度和kl散度
p(x)
和q(x)
也被计算出来。
例如,
importnumpyasnpfromscipy.statsimportnormfromdensratioimportdensrationp.random.seed(1)x=norm.rvs(size=500,loc=0,scale=1./8)y=norm.rvs(size=500,loc=0,scale=1./2)alpha=0.1densratio_obj=densratio(x,y,alpha=alpha)print(densratio_obj)
提供以下输出:
#> Method: RuLSIF
#>
#> Alpha: 0.1
#>
#> Kernel Information:
#> Kernel type: Gaussian
#> Number of kernels: 100
#> Bandwidth(sigma): 0.1
#> Centers: matrix([[-0.09591373],..
#>
#> Kernel Weights (theta):
#> array([0.04990797, 0.0550548 , 0.04784736, 0.04951904, 0.04840418,..
#>
#> Regularization Parameter (lambda): 0.1
#>
#> Alpha-Relative PE-Divergence: 0.6187941335987046
#>
#> Alpha-Relative KL-Divergence: 0.7037648129307482
#>
#> Function to Estimate Density Ratio:
#> compute_density_ratio(x)
#>
在这种情况下,真密度比w(x)
是已知的,因此我们可以比较
w(x)
具有估计的密度比w-hat(x)
。下面的代码给出
上面显示的绘图。
frommatplotlibimportpyplotaspltfromnumpyimportlinspacedeftrue_alpha_density_ratio(sample):returnnorm.pdf(sample,0,1./8)/(alpha*norm.pdf(sample,0,1./8)+(1-alpha)*norm.pdf(sample,0,1./2))defestimated_alpha_density_ratio(sample):returndensratio_obj.compute_density_ratio(sample)sample_points=np.linspace(-1,3,400)plt.plot(sample_points,true_alpha_density_ratio(sample_points),'b-',label='True Alpha-Relative Density Ratio')plt.plot(sample_points,estimated_alpha_density_ratio(sample_points),'r-',label='Estimated Alpha-Relative Density Ratio')plt.title("Alpha-Relative Density Ratio - Normal Random Variables (alpha={:03.2f})".format(alpha))plt.legend()plt.show()<H2>2。安装
您可以从 pypi
$ pip install densratio
此外,您还可以从 github
$ pip install git+https://github.com/hoxo-m/densratio_py.git
有关densratio包的源代码,请访问github https://github.com/hoxo-m/densratio_py
<H2>3。细节 <H3>3.1。基础课程包提供了densratio()
。函数返回一个对象
具有计算估计密度比的函数。
对于数据样本x
和y
,
fromscipy.statsimportnormfromdensratioimportdensratiox=norm.rvs(size=200,loc=1,scale=1./8)y=norm.rvs(size=200,loc=1,scale=1./2)result=densratio(x,y)
在这种情况下,result.compute_density_ratio()
可以计算
密度比。
frommatplotlibimportpyplotaspltdensity_ratio=result.compute_density_ratio(y)plt.plot(y,density_ratio,"o")plt.xlabel("x")plt.ylabel("Density Ratio")plt.show()
<H3>3.2。方法
该软件包通过rulsif方法估计密度比。
rulsif(相对无约束最小二乘重要度拟合) 通过最小化平方估计α相对密度比 真实和估计α相对比率之间的损失。你可以找到 Hido等人的更多信息。(2011)[1]和Liu等人(2013)[4]。
该方法假设α相对密度比表示为 线性核模型:
w(x)=θ1*k(x,c1)+θ2*k(x,c2)+…+tab*k(x,cb)
其中,k(x,c)=exp(-x-c ^2/(2*sigma^2))
是高斯分布
径向基函数核。
densratio()
执行以下操作:-决定内核参数sigma
通过交叉验证。-优化内核权重theta
。-计算
α相对pe散度和kl散度
α相对比率。
因此,您可以获得compute_density_ratio()
,这将
计算通过坐标的α相对密度比。
densratio()
输出如下结果:
#> Method: RuLSIF
#>
#> Alpha: 0
#>
#> Kernel Information:
#> Kernel type: Gaussian
#> Number of kernels: 100
#> Bandwidth(sigma): 0.1
#> Centers: matrix([[0.92113356],..
#>
#> Kernel Weights (theta):
#> array([0.08848922, 0.03377533, 0.0753727 , 0.06141277, 0.02543963,..
#>
#> Regularization Parameter (lambda): 1.0
#>
#> Alpha-Relative PE-Divergence: 0.9635169300831035
#>
#> Alpha-Relative KL-Divergence: 0.8388266265473269
#>
#> Function to Estimate Density Ratio:
#> compute_density_ratio(x)
#>
- 方法固定为rulsif。
- 核类型固定为高斯径向基函数。
- 内核数是线性模型中的内核数。
您可以通过设置
kernel_num
参数进行更改。拖欠,内核数=100
- 带宽(sigma)是高斯核带宽。默认情况下,
sigma="auto"
,算法自动选择最佳 交叉验证的值。如果您设置一个数字 使用。如果设置sigma
数值数组,则算法选择 通过交叉验证获得最佳值。 - 中心是线性模型中高斯核的中心。
这些是从数据样本中随机选择的
分子分布
p(x)
。你可以在result.kernel\u信息中心
- 核权重(θ)是线性核中的θ参数
模型。您可以在
result.theta
中找到这些值。
- 估计α相对密度比的函数是
命名为
compute_density_ratio()
到目前为止,我们已经处理了一维数据样本x
和y
。
densratio()
允许输入多维数据样本
numpy.ndarray
或numpy.matrix
,只要它们的尺寸是
同样,
例如,
fromscipy.statsimportmultivariate_normalfromdensratioimportdensrationp.random.seed(1)x=multivariate_normal.rvs(size=3000,mean=[1,1],cov=[[1./8,0],[0,1./8]])y=multivariate_normal.rvs(size=3000,mean=[1,1],cov=[[1./2,0],[0,1./2]])alpha=0densratio_obj=densratio(x,y,alpha=alpha,sigma_range=[0.1,0.3,0.5,0.7,1],lambda_range=[0.01,0.02,0.03,0.04,0.05])print(densratio_obj)
提供以下输出:
importnumpyasnpfromscipy.statsimportnormfromdensratioimportdensrationp.random.seed(1)x=norm.rvs(size=500,loc=0,scale=1./8)y=norm.rvs(size=500,loc=0,scale=1./2)alpha=0.1densratio_obj=densratio(x,y,alpha=alpha)print(densratio_obj)0
在这种情况下,我们也可以将真密度比与 估计密度比。
importnumpyasnpfromscipy.statsimportnormfromdensratioimportdensrationp.random.seed(1)x=norm.rvs(size=500,loc=0,scale=1./8)y=norm.rvs(size=500,loc=0,scale=1./2)alpha=0.1densratio_obj=densratio(x,y,alpha=alpha)print(densratio_obj)1 <H2>5。参考文献
[1]Hido,S.,Tsuboi,Y.,Kashima,H.,Sugiyama,M.,和Kanamori,T.。 使用直接密度比估计的统计异常值检测。 知识和信息系统2011。
[2]Sugiyama,M.,Nakajima,S.,Kashima,H.,von Bünau,P.和Kawanabe, m.模型选择的直接重要性估计及其应用 协变量移位适应的应用。NIPS 2007。
[3]Sugiyama,M.,Suzuki,T.和Kanamori,T.丹斯城市比率估计 机器学习。剑桥大学出版社2012。
[4]Liu,S.,Yamada,M.,Collier,N.,和Sugiyama,M.变更点 基于相对密度比估计的时间序列数据检测 神经网络,2013年。