数据集分布评估-KDE (核密度估计)、KS检验

参考:
https://zhuanlan.zhihu.com/p/368073953
https://blog.csdn.net/u014028070/article/details/75171108
https://www.cnblogs.com/jpld/p/14186239.html
https://cxybb.com/article/qq_23100417/119392520
https://viruspc.github.io/blog/kde.html

在训练集上运行性能良好,却在测试集上效果不佳的模型。

  • 如果此时开发集和测试集的分布相同,那么你就能清楚地明白问题所在:算法在开发集上过拟合了(overfit)。解决方案显然就是去获取更多的开发集数据。
  • 但是如果开发集和测试集服从不同的分布,解决方案就不那么明确了。此时可能存在以下一种或者多种情况:1.算法在开发集上过拟合了。2.测试集比开发集更难进行预测,尽管算法做得足够好了,却很难有进一步的提升空间。3.测试集不一定更难预测,但它与开发集性质并不相同(分布不同)。

因此在开发集上表现良好的算法不一定在测试集上也能够取得出色表现。如果是这种情况,大量针对开发集性,能的改进工作将会是徒劳的。

大部分机器学习算法都有一个前提假设:训练数据样本和位置的测试样本来自同一分布。如果测试数据的分布跟训练数据不一致,那么就会影响模型的效果。

核密度估计((kernel density estimation)

核密度估计(kernel density estimation,KDE)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一,通过核密度估计图可以比较直观的看出数据样本本身的分布特征。

KDE 分布图可以用于对比训练集和测试集的分布,在matlab中利用其自带的核密度估计函数([f,xi] = ksdensity(x))可以实现。
函数:ksdensity
功能:根据给定的数据,估计概率密度分布
具体含义:计算样本向量x的概率密度估计,返回在xi点的概率密度f,此时我们使用plot(xi,f)就可以绘制出概率密度曲线。该函数,首先统计样本x在各个区间的概率(与hist有些相似),再自动选择xi,计算对应的xi点的概率密度

%by dynamic
%see also http://www.matlabsky.com
%contact me matlabsky@gmail.com

%给一个随机样本
x=[randn(30,1); 5+randn(30,1)];

%计算出各点的概率密度
[f,xi]=ksdensity(x);

%绘制图形
subplot(211)
plot(x)
title('样本数据(Sample Data)')

subplot(212)
plot(xi,f)
title('概率密度分布(PDF)')

KS检验(Kolmogorov-Smirnov)

KDE是PDF(概率分布函数Probability Distribution Function)来对比,而KS检验是基于CDF(累计分布函数Cumulative Distribution Function)来检验两个数据分布是否一致,它也是非参数检验方法(即不知道数据分布情况)。两样本K-S检验由于对两样本的经验分布函数的位置和形状参数的差异都敏感,所以成为比较两样本的最有用且最常用的非参数方法之一。(KS适用于样本量比较小的时候)

k-s检验分为单样本kstest和双样本kstest2检验:
1. Single sample Kolmogorov-Smirnov goodness-of-fit hypothesis test.
matlab中kstest函数的使用:

H = kstest(X) %测试向量X是否服从标准正态分布,测试水平为5%。H=0接受原假设,H=1拒绝原假设。
H = kstest(X,cdf) %指定累积分布函数为cdf的测试(cdf=[ ]时表示标准正态分布),测试水平为5%
H = kstest(X,cdf,alpha) % alpha为指定测试水平H=kstest(X,cdf,alpha,tail) % tail=0为双侧检验, tail=1单侧(<)检验, tail=-1单侧(>) 检验
[H,P,KSSTAT,CV] = kstest(X,cdf,alpha) %P为原假设成立的概率,KSSTAT为测试统计量的值,CV为是否接受假设的临界值。

2.Two-sample Kolmogorov-Smirnov test
检验两个数据向量之间的分布的。

[h,p,ks2stat] = kstest2(x1,x2,alpha,tail)

% x1,x2都为向量,ALPHA是显著性水平(默认0.05)。TAIL是表示检验的类型(默认unequal,不平衡)。

对抗验证(Adversarial validation)

除了 KDE 和 KS检验,目前比较流行的是对抗验证,它并不是一种评估模型效果的方法,而是一种用来确认训练集和测试集的分布是否变化的方法。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: KDE(Kernel Density Estimation)是一种非参数的概率密度估计方法,用于估计一个随机变量的概率分布函数。在Java中,可以使用各种库和算法来实现KDE。 首先,需要导入Java中用于科学计算和统计的库,例如Apache Commons Math或Weka。这些库提供了各种统计函数和数据结构,能够方便地进行核密度估计的实现。 接下来,需要准备数据,这些数据是我们想要估计概率密度的样本数据。可以将这些数据存储在Java中的数组或其他适合的数据结构中。 然后,通过选择合适的核函数和带宽参数,进行核密度估计的计算。常用的核函数有高斯核函数和矩形核函数。高斯核函数的计算公式为: K(u) = (1 / sqrt(2 * pi)) * exp((-1 * u^2) / 2) 其中u是一个样本和待估计点之间的欧氏距离,exp表示自然指数函数。带宽参数的选择对估计结果很重要,通常可以尝试不同的带宽参数值,选择最佳的结果。 最后,将计算得到的核密度估计结果可视化出来,可以使用Java图形库,如JFreeChart,将估计结果绘制成直方图或曲线图。 总结起来,要实现KDE的Java实现,需要导入合适的库,准备数据,选择核函数和带宽参数,计算核密度估计结果,最后将结果可视化展示出来。这样就可以对一个随机变量的概率分布函数进行估计和分析。 ### 回答2: KDE核密度估计是一种非参数性质的概率密度函数估计方法,它可以通过将多个核函数在各个数据点附近进行加权求和来估计数据的概率密度函数。该方法在统计学和数据分析中广泛应用。 KDE核密度估计的Java实现可以通过以下步骤实现: 1. 导入所需的Java库和类。根据需要,可以使用数值计算库如Apache Commons Math库等。 2. 准备数据集。将待估计的数据存储在一个数组或集合中。 3. 根据数据集的特性选择合适的核函数。常用的核函数包括高斯核函数、矩形核函数和三角核函数等。对于Java实现,可以自定义核函数的计算方法或使用现有的库函数。 4. 选择合适的带宽参数。带宽参数决定了核函数的宽度,进而影响估计的平滑程度。通常可以使用Silverman's Rule of Thumb等方法来选择带宽参数。 5. 对于每个数据点,计算核函数在该点附近的值。根据选择的核函数和带宽参数,计算距离该点一定范围内的所有数据点与该点的核函数值。 6. 对所有的数据点的核函数值进行加权求和。权重可以是均匀的,也可以使用距离或其他相关度量来计算。 7. 对加权求和结果进行归一化处理,得到密度估计函数。 8. 可选地,绘制密度估计函数的图表或输出相关统计指标。 通过以上步骤,我们可以实现KDE核密度估计的Java程序。这个程序将会估计给定数据集的概率密度函数,帮助我们在数据分析和统计模型中更好地理解数据分布特征和概率分布情况。 ### 回答3: KDE(Kernel Density Estimation)是一种用于估计概率密度函数的非参数方法,它可以通过一系列核函数在样本点周围产生一些连续的函数来估计未知分布的概率密度函数。而基于Java语言的KDE核密度估计实现可以通过以下步骤来完成: 1. 首先需要收集用于训练的数据集。这个数据集包含了从未知分布中抽取的样本点。 2. 将数据集存储在Java程序中。可以将数据集存储为一个数组或者使用Java集合类来存储。 3. 选择一个适当的核函数作为估计的基础。通常使用的核函数有高斯核函数和Epanechnikov核函数等。 4. 定义带宽参数。带宽参数决定了核函数的宽度,它直接影响了估计的精度。带宽可以通过交叉验证等方法来选择。 5. 实现核密度估计算法。可以使用循环遍历所有数据点,并针对每个数据点计算它周围的核函数值。然后将这些核函数值相加得到估计的概率密度函数。 6. 将估计的概率密度函数可视化。可以使用Java的图形库,如JavaFX或Swing来绘制估计的概率密度函数曲线。 7. 验证估计结果。可以通过与真实密度函数进行比较或者使用交叉验证等方法来验证估计结果的准确性和稳定性。 通过以上步骤,就可以使用Java实现KDE核密度估计。这个实现可以应用于各种领域,如金融、医学、社会科学等,用于对未知分布的概率密度函数进行估计,并进行相关的数据分析和预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值