利用cuda通过cupy实现了nadaraya-waston核密度和核条件概率估计。它比CPU版本快得多,但它需要高内存的GPU。
kde-gpu的Python项目详细描述
»?
kde_gpu
基于gpu的nadaraya-watson核密度估计器(cuda)
作者
陈晨
运行环境设置
你必须安装cupy才能使用gpu!啊! 见https://github.com/cupy/cupy
类似于scipy.kde_gaussian和statsmodels.nonparametric.kernel_density.KDEMultivariateConditional,我们通过cupy使用cuda实现了nadaraya-waston核密度和核条件概率估计。然而,它比CPU版本快得多,它最大限度地利用了GPU存储器。
在当前目录中创建一个名为“data”的文件夹。然后复制orl并在内部裁剪yaleb数据集。请确保具有以下文件树结构:
|---kde_gpu\
***——版本.py\
***---纳达拉亚华生.py \
***---条件概率.py\
*|---设置.py \
*|---示例.py \
*|---readme.md\使用以下命令安装
kde_gpu
:(如果计算机中的默认python
是python2
,请使用pip3
)$ pip install -e .
这个命令将运行setup.py
,在这里我们指定运行nmf
所需的依赖项。我们需要的依赖项是:
"scipy>=1.0.0",
"pandas>=0.20.2",
请注意,如果计算机中已安装包的版本号低于所述版本号,pip
将卸载过期包,并安装版本号大于或等于setup.py
中所述版本号的包。
示例
"""
@author: chen.chen.adl@gmail.com
"""
#import kernel_smoothing
from scipy import stats
import pandas as pd
import cupy as cp
import numpy as np
import time
rv = stats.expon(0,1)
x = rv.rvs(size=10000)
density_real = rv.pdf(x)
t1=time.time()
kde_scipy=stats.gaussian_kde(x.T,bw_method='silverman')
kde_scipy=kde_scipy(x.T)
print(time.time()-t1)
t1=time.time()
kde_cupy=kde(cp.asarray(x.T),bw_method='silverman')
print(time.time()-t1)
df = pd.DataFrame({'x1':x,'kde_scipy':kde_scipy,
'kde_cupy':cp.asnumpy(kde_cupy).squeeze(),'real density':density_real})
df['scipy_mean_absolute_error']=np.abs(df['kde_scipy']-df['real density'])
df['cupy_mean_absolute_error']=np.abs(df['kde_cupy']-df['real density'])
print(df.mean())
rv = stats.truncnorm(-3,2,30,10)
nsample=10000
x = cp.asarray(rv.rvs(nsample))
ycondx = cp.asarray(cp.random.rand(nsample))
y = 10*(ycondx-0.5)+x
cdf_conditional_real = ycondx
df = pd.DataFrame({'y':cp.asnumpy(y),'x':cp.asnumpy(x),'real density':cp.asnumpy(cdf_conditional_real)})
df['nadaraya watson']= kernel_smoothing_ecdf(y,x)
df['nw_error']=np.abs(df['nadaraya watson']-df['real density'])
df.mean()