首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变train_test_ratio引起的Shogun /二次MMD误差

变train_test_ratio引起的Shogun /二次MMD误差
EN

Stack Overflow用户
提问于 2018-01-26 18:37:41
回答 2查看 263关注 0票数 1

我使用Shogun运行MMD (二次型),并根据它们的样本比较两个非参数分布(下面是1D的代码,但我也看过2D样本)。在下面显示的玩具问题中,我试图在选择优化内核的过程中改变训练样本和测试样本之间的比率(KSM_MAXIMIZE_MMD是选择策略;我还使用了KSM_MEDIAN_HEURISTIC)。看来,除1以外的任何比率都会产生错误。

在这种情况下,我可以改变这个比率吗?(我看到它在:mmd.html中使用,但在那里被设置为1)

my代码的简明版本(受笔记本的启发,可在:testing.html上找到):

代码语言:javascript
复制
import shogun as sg
import numpy as np
from scipy.stats import laplace, norm

n = 220
mu = 0.0
sigma2 = 1
b=np.sqrt(0.5)
X = sg.RealFeatures((norm.rvs(size=n) * np.sqrt(sigma2) + mu).reshape(1,-1))
Y = sg.RealFeatures(laplace.rvs(size=n, loc=mu, scale=b).reshape(1,-1))

mmd = sg.QuadraticTimeMMD(X, Y)
mmd.add_kernel(sg.GaussianKernel(10, 1.0))
mmd.set_kernel_selection_strategy(sg.KSM_MAXIMIZE_MMD)
mmd.set_train_test_mode(True)       
mmd.set_train_test_ratio(1)
mmd.select_kernel()

mmd_kernel = sg.GaussianKernel.obtain_from_generic(mmd.get_kernel())
kernel_width = mmd_kernel.get_width()
statistic = mmd.compute_statistic()
p_value = mmd.compute_p_value(statistic)

print p_value 

这个精确的版本运行并打印p值很好。如果我将传递给mmd.set_train_test_ratio()的参数从1更改为2,则得到:

代码语言:javascript
复制
SystemErrorTraceback (most recent call last)
<ipython-input-30-dd5fcb933287> in <module>()
     25 kernel_width = mmd_kernel.get_width()
     26 
---> 27 statistic = mmd.compute_statistic()
     28 p_value = mmd.compute_p_value(statistic)
     29 

SystemError: [ERROR] In file /feedstock_root/build_artefacts/shogun-cpp_1512688880429/work/shogun-shogun_6.1.3/src/shogun/statistical_testing/internals/mmd/ComputeMMD.h line 90: assertion kernel_matrix.num_rows==size && kernel_matrix.num_cols==size failed in float32_t shogun::internal::mmd::ComputeMMD::operator()(const shogun::SGMatrix<T>&) const [with T = float; float32_t = float] file /feedstock_root/build_artefacts/shogun-cpp_1512688880429/work/shogun-shogun_6.1.3/src/shogun/statistical_testing/internals/mmd/ComputeMMD.h line 90

更糟糕的是,如果我使用低于1的值。除了以下错误之外,jupyter笔记本内核每次都会崩溃(之后我需要重新运行整个笔记本;消息说:“内核似乎死了,它将自动重新启动。”)

代码语言:javascript
复制
SystemErrorTraceback (most recent call last)
<ipython-input-31-cb4a5224f4ef> in <module>()
     20 mmd.set_train_test_ratio(0.5)
     21 
---> 22 mmd.select_kernel()
     23 
     24 mmd_kernel = sg.GaussianKernel.obtain_from_generic(mmd.get_kernel())

SystemError: [ERROR] In file /feedstock_root/build_artefacts/shogun-cpp_1512688880429/work/shogun-shogun_6.1.3/src/shogun/kernel/Kernel.h line 210: GaussianKernel::kernel(): index out of Range: idx_a=146/146 idx_b=0/146

完整的代码(在jypyter笔记本中)可以在:http://nbviewer.jupyter.org/url/dmitry.duplyakin.org/p/jn/kernel-minimal.ipynb上找到。

如果我错过了一步,或者需要尝试另一种方法,请告诉我。

附带问题:

  • mmd.htmltesting.html都展示了使用sg.GaussianKernel(10, <width>)的示例。除了第一个参数的名称、缓存大小之外,我找不到更多关于它的信息。我应该怎么什么时候改变它?
  • 正如引用的笔记本中所提到的,mmd.get_kernel_selection_strategy().get_name()只返回泛型名称,特别是KernelSelectionStrategy。如何从KSM_MEDIAN_HEURISTIC类的实例中获得所选策略的更具体的名称(例如,sg.QuadraticTimeMMD )?

如有任何相关资料或参考资料,将不胜感激。

肖贡版本: v6.1.3_2017-12-7_19:14

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-20 23:28:29

摘要(摘自评论):

票数 0
EN

Stack Overflow用户

发布于 2018-01-27 06:31:45

  • train_test_ratio属性是训练中使用的样本数与测试中使用的样本数之间的比率。当您打开train_test_mode时,它决定在每种模式中获取多少样例的方式如下所示。 num_training_samples = m_num_samples * train_test_ratio / (train_test_ratio + 1) num_testing_samples = m_num_samples / (train_test_ratio + 1) 它隐含地假定了可分性。因此,2的train_test_ratio将尝试使用2/3的数据进行培训,1/3的数据用于测试,这对于您拥有的样本总数( 220 )来说是有问题的。根据逻辑,它设置num_training_samples = 146和num_testing_samples = 73,这两项加起来不等于220。当使用0.5作为列车测试比率时也会出现类似的问题.如果您为train_test_ratio使用了其他值,它完美地将样本总数除以,我认为这些错误就会消失。
  • 我不完全确定,但我认为当您在Shogun中使用SVMLight时,缓存是有意义的。有关详细信息,请查看http://svmlight.joachims.org/。从他们的页面 -m 5.-以MB为单位的内核评估的缓存大小(默认为40)越大,速度越快.
  • 使用的内核选择策略没有很好的打印,但是您可以执行mmd.get_kernel_selection_strategy().get_method(),它返回枚举值(类型为EKernelSelectionMethod),这可能会有帮助。由于Shogun中还没有文档化,所以这里是您可能使用的C++等效文件。 枚举EKernelSelectionMethod { KSM_MEDIAN_HEURISTIC,KSM_MAXIMIZE_MMD,KSM_MAXIMIZE_POWER,KSM_CROSS_VALIDATION,KSM_AUTO = KSM_MAXIMIZE_POWER };
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48467554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档