5

我有一组数据,我想为其找到一个平均峰值。我在 Numbers.app 中做了一些测试,看看我在做什么,如果我制作数据集的图表,它有一个称为“多项式趋势线”的功能,它绘制数据曲线,该曲线的峰值看起来就像我追求的点/价值一样。

那么我如何以编程方式计算该曲线并找到曲线上的切线呢?

我一直在维基百科上四处寻找,发现诸如“正态分布”和“多项式回归”之类的主题似乎非常相关,但我一直发现很难遵循维基百科上的方程式,所以我希望这里的人可以给我一个程序示例。

这里有几个图表来说明我所追求的。绿点是数据点,蓝线是“多项式趋势线”(6 阶)。那条趋势线的“峰值”就是我所追求的。

偶数数据集示例 不均匀数据集的示例

更新的问题:

在一些答案之后,我意识到我的问题需要重新表述,因为问题不是真正如何找到曲线的峰值,而是如何从绿点生成蓝色曲线,以便我可以在数据集中找到“权重”谎言。目标是获得一种“平均最大值”

我想另一个问题是“这个特定问题实际上叫什么?” ;)

4

6 回答 6

5

尽管数据看起来像您不一定遵循正态分布。

分布拟合的主题非常复杂,除非您对数据分布有一些明确的先验假设,否则我不会冒险。如果您对分布类型有假设,请查看最小二乘最大似然估计方法。

但是,我建议您应该使用贝塞尔样条曲线LOESS来“平滑”您的数据,然后找到计算曲线的最大值。

我怀疑使用导数的方法在这里是否可行。

于 2010-08-18T12:48:31.730 回答
2

正如您所说的正态分布,并且似乎能够将数据拟合到函数中,您应该拟合正态分布,其中 jas 参数µσ分别是分布的均值和标准差(参见wiki第一个公式)。

将此函数拟合到您的数据,峰值将位于平均值,由 给出µ

于 2010-08-18T12:45:47.007 回答
2

您可以从计算平均值和标准差/方差开始。这会告诉你一些关于分布的信息。

我认为您无法解决任意数据集的问题。所以你需要有一些共同的特征行为。

毕竟,根据方法的不同,拟合曲线可能有些随意——需要根据您的问题域适当地选择它——也许需要进行一些加权或数据清理以首先排除异常值。

于 2010-08-18T13:04:25.917 回答
1

导数在峰值处等于零。

于 2010-08-18T12:39:13.747 回答
1

假设您正在绘制 Y 与 X。您已经有了与每个 X 对应的 Y 值。当 X=X1 时,让 Y(X1) 表示 Y 的平均值。

设置变量 max = 0。然后计算每个 X 处的 Y 值。如果 Y(X1) > max 则设置 max=Y(X)。一旦你经历了所有的 Y,你将拥有的最大值将是 Y 的峰值。

例如,在您的示例中,只需遍历所有绿点并找到其中的最大值。那应该是巅峰吧?让我知道这是否是你想要的。您使用哪种编程语言?你不需要为了达到顶峰而进入发行版和其他东西。

于 2010-08-18T12:45:09.753 回答
0

我是一个完全“R”的新手,但我一直在自己的数据中处理同样的事情,所以我想我会分享。我相信我会因为这是一种不好的方式(或者不是一种“整洁”的方式)而变得松懈,但对我来说是这样的——至少现在是这样。

我有 50 个数据集,它们的峰形与您的一样(每个数据集的前导斜率大,下降边缘的斜率较慢)。首先,我测试了多项式拟合以获得最佳“适合目的”,但没有过度拟合... x<-dataset$x ## 或从表中的列中提取,例如 dataset[,1] y<-dataset$y ## 或从表中的列中提取,例如 dataset[,2] k=2 ## 知道它是多项式,所以从 3 开始 while(k<100) { k=k+1 fit=lm(y~poly(x, k,raw=TRUE)) var[k]=summary(fit)$sigma } plot(var)

在这种情况下,多项式 11 是没有过拟合的最佳拟合。然后,您可以运行 ANOVA 并确保,但我会跳过所有这些。

现在我从上面的“lm”的系数创建了我的多项式。fit=lm(y~poly(x,11,raw=TRUE)) fit.coef <- c(summary(fit)$coefficients[1,1], summary(fit)$coefficients[2,1],.. . fit.poly <- 多项式(fit.coef)

然后是导数:

fit.deriv <- deriv(fit.poly)

现在对于峰值的斜率,您可以简单地将 x (max) 的值从原始多项式替换为导数。

我想要所有的斜坡,所以...

fit.slope <- predict(fit.deriv,x) ## x here represents all the x values above.  For a single value you can just replace x with the value of x representing the max value in your polynomial

希望这对原始问题有所帮助,同时邀请有关如何更好地做到这一点的评论,因为我也很想学习和清理我的代码!

谢谢。

于 2015-06-19T12:42:14.293 回答