我使用Shogun运行MMD (二次型),并根据它们的样本比较两个非参数分布(下面是1D的代码,但我也看过2D样本)。在下面显示的玩具问题中,我试图在选择优化内核的过程中改变训练样本和测试样本之间的比率(KSM_MAXIMIZE_MMD是选择策略;我还使用了KSM_MEDIAN_HEURISTIC)。看来,除1以外的任何比率都会产生错误。
在这种情况下,我可以改变这个比率吗?(我看到它在:mmd.html中使用,但在那里被设置为1)
my代码的简明版本(受笔记本的启发,可在:testing.html上找到):
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,则得到:
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笔记本内核每次都会崩溃(之后我需要重新运行整个笔记本;消息说:“内核似乎死了,它将自动重新启动。”)
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上找到。
如果我错过了一步,或者需要尝试另一种方法,请告诉我。
附带问题:
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
发布于 2018-02-20 23:28:29
摘要(摘自评论):
发布于 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使用了其他值,它完美地将样本总数除以,我认为这些错误就会消失。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 };https://stackoverflow.com/questions/48467554
复制相似问题