找到一组数据的“峰值”

时间:2010-08-18 12:32:22

标签: normal-distribution

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

那么我怎样才能以编程方式计算出该曲线并在曲线上找到切线?

我一直在环顾维基百科,发现像“正态分布”和“多项式回归”这样的话题似乎非常相关,但我总是发现很难在维基百科上遵循这些方程式,所以我希望也许这里的某个人可以给我一个程序化的例子。

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

Example with even dataset Example with uneven dataset

更新了问题:

经过一些回答后,我意识到我的问题需要改写,因为问题不是如何找到曲线的峰值而是更多的是如何从绿点生成蓝色曲线所以我可以找到数据集中的位置“重量”在于。 目标是获得某种“平均最大值”

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

6 个答案:

答案 0 :(得分:4)

虽然数据看起来不一定是在正常分发之后。

分布拟合的主题非常复杂,除非您对数据分布有一些明确的先验假设,否则我不敢冒险。如果您对分布类型有假设,请查看least squaresmaximum likelihood extimation方法。

但是,我建议你应该使用bezier-splineLOESS“平滑”数据,然后找到计算曲线的最大值。

我怀疑使用衍生物的方法在这里可行。

答案 1 :(得分:1)

当你谈到正态分布,并且似乎能够将数据拟合到函数时,你应该适合正态分布,jas参数µσ,它们分别是均值和分布的标准差(见wiki第一个公式)。

使此功能适合您的数据,峰值将为µ给出的平均值。

答案 2 :(得分:1)

您可以从计算均值和标准差/方差开始。这将告诉您有关分发的一些信息。

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

毕竟,根据方法拟合曲线可能有些随意 - 需要针对您的问题域进行适当选择 - 可能需要进行一些加权或数据清理才能首先抛出异常值。

答案 3 :(得分:0)

Derivative在峰值时等于零。

答案 4 :(得分:0)

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

设置变量max = 0.然后计算每个X的Y值。如果Y(X1)> max然后设置max = Y(X)。一旦你完成了所有的Y,你将获得的最大值将是Y的峰值。

例如,在您的示例中,只需浏览所有绿点并找到它们的最大值。那将是最高峰,对吧?如果这就是你想要的,请告诉我。你使用哪种编程语言?你不需要进入发行版和东西只是为了达到顶峰..

答案 5 :(得分:0)

我是一个完全“R”新手,但我在自己的数据中一直在做同样的事情,所以我想我会分享。我相信我会因为这是一种糟糕的做法(或者不是一种“干净”的方式)而得到很多松懈,但这对我来说是有目的的 - 至少目前是这样。

我有50个数据集,其峰值形状与您的一样(每个前导的斜率较大,下降边缘的斜率较慢)。首先,我测试了许多多项式拟合,以获得最佳“适合目的”但不适合...     x&lt; -dataset $ x ##或从表中的列拉取,例如,dataset [,1]     y&lt; -dataset $ y ##或从表格中的列中提取,例如,数据集[,2]     k = 2 ##知道它是多项式,所以从3开始     而(k <100){     K = K + 1     配合= LM(Y〜聚(X,K,生= TRUE))     变种[K] =摘要(FIT)$西格玛     }     情节(VAR)

在这种情况下,11的多项式是最合适的,没有过拟合。然后你可以运行一个方差分析并确保但我会跳过所有这些。

现在我从上面“lm”的系数创建了我的多项式。     配合= LM(Y〜聚(X,如图11所示,原始= TRUE))     fit.coef&lt; - c(summary(fit)$ coefficients [1,1],summary(fit)$ coefficients [2,1],...     fit.poly&lt; - polynomial(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

希望两者都有助于解决原始问题,同时邀请评论如何做得更好,因为我也喜欢学习和清理我的代码!

感谢。