相关疑难解决方法(0)

2D阵列中的峰值检测

我正在帮助一家兽医诊所测量狗爪下的压力.我使用Python进行数据分析,现在我不得不试图将爪子分成(解剖学)子区域.

我制作了每个爪子的2D阵列,它由爪子随时间加载的每个传感器的最大值组成.这是一个爪子的例子,我用Excel绘制了我想要"检测"的区域.这些是传感器周围的2×2个盒子,具有局部最大值,它们一起具有最大的总和.

替代文字

所以我尝试了一些实验并决定只查找每列和每行的最大值(由于爪子的形状,不能在一个方向上查看).这似乎可以很好地"检测"单独脚趾的位置,但它也标记了相邻的传感器.

替代文字

那么告诉Python哪些最大值是我想要的最好的方法是什么?

注意:2x2正方形不能重叠,因为它们必须是单独的脚趾!

我也采用2x2作为方便,欢迎任何更高级的解决方案,但我只是一个人类运动科学家,所以我既不是真正的程序员也不是数学家,所以请保持"简单".

这是一个可以加载版本np.loadtxt


结果

所以我尝试了@jextee的解决方案(见下面的结果).正如你所看到的,它在前爪上很有效,但后腿的效果不太好.

更具体地说,它无法识别出第四个脚趾的小峰值.这显然是循环看起来自上而下朝向最低值的事实所固有的,而不考虑这是什么.

有谁知道如何调整@jextee的算法,以便它也可以找到第4个脚趾?

替代文字

由于我还没有处理任何其他试验,我不能提供任何其他样品.但我之前提供的数据是每只爪子的平均值.该文件是一个数组,其最大数据为9个爪子,它们与盘子接触的顺序.

该图像显示了它们如何在空间上展开.

替代文字

更新:

我已经为任何感兴趣的人建立了一个博客,我已经设置了一个包含所有原始测量值的SkyDrive.所以对于要求更多数据的人来说:给你更大的力量!


新更新:

所以在我得到关于爪子检测爪子分类的问题的帮助后,我终于能够检查每个爪子的脚趾检测!事实证明,除了像我自己的例子中那样大小的爪子之外,它在任何东西上都不能很好地工作.事后看来,任意选择2x2是我自己的错.

这是一个错误的例子:钉子被识别为脚趾,"脚跟"如此宽,它被识别两次!

替代文字

爪子太大,因此在没有重叠的情况下采用2x2尺寸会导致一些脚趾被检测到两次.相反,在小型犬中,它经常无法找到第五个脚趾,我怀疑它是由2x2区域太大引起的.

对我的所有测量结果进行了当前的解决方案之后,我得出了令人吃惊的结论:几乎所有的小型犬都没有找到第5个脚趾,并且对于大型犬的50%以上的影响它会发现更多!

显然我需要改变它.我自己的猜测是将neighborhood小型狗的体型改为小型犬,大型犬则更大.但是generate_binary_structure不会让我改变数组的大小.

因此,我希望其他人有更好的建议来定位脚趾,也许脚趾区域尺寸与爪子尺寸一致?

python image-processing

843
推荐指数
18
解决办法
9万
查看次数

Python/SciPy的峰值查找算法

我可以通过查找一阶导数或其他东西的零交叉来自己编写一些东西,但它似乎是一个通用的函数,可以包含在标准库中.谁知道一个?

我的特定应用是2D阵列,但通常它将用于在FFT等中查找峰值.

具体而言,在这些类型的问题中,存在多个强峰,然后是许多较小的"峰值",这些"峰值"仅由应该忽略的噪声引起.这只是例子; 不是我的实际数据:

一维峰值:

带峰值的FFT输出

二维峰值:

具有圆圈峰值的Radon变换输出

峰值寻找算法将找到这些峰值的位置(不仅仅是它们的值),理想情况下会找到真正的样本间峰值,而不仅仅是具有最大值的索引,可能使用二次插值等.

通常,您只关心一些强峰,因此它们要么被选中,要么是因为它们高于某个阈值,要么是因为它们是有序列表的前n个峰值,按振幅排列.

正如我所说,我知道如何自己写这样的东西.我只是问是否有一个已知的功能或包已知可以正常工作.

更新:

翻译了一个MATLAB脚本,它适用于1-D案例,但可能更好.

更新更新:

sixtenbe 为1-D案例创造了更好的版本.

python fft scipy hough-transform

123
推荐指数
6
解决办法
10万
查看次数

如何从数据集中删除异常值

我有一些美丽与年龄的多元数据.年龄范围为20-40,间隔为2(20,22,24 ...... 40),并且对于每个数据记录,它们的年龄和美容等级为1-5.当我对这些数据进行箱形图(横跨X轴的年龄,Y轴上的美观评级)时,在每个框的胡须外面都会绘制一些异常值.

我想从数据框本身中删除这些异常值,但我不确定R如何计算其箱形图的异常值.下面是我的数据可能是什么样子的示例. 在此输入图像描述

statistics r outliers

92
推荐指数
8
解决办法
31万
查看次数

使用Boost计算C++中样本矢量的均值和标准差

有没有办法使用Boost计算含有样品的载体的平均值和标准偏差?

或者我是否必须创建一个累加器并将矢量输入其中?

c++ algorithm statistics boost mean

84
推荐指数
5
解决办法
13万
查看次数

测量信号的峰值检测

我们使用数据采集卡从设备获取读数,将信号增加到峰值,然后回落到接近原始值.为了找到峰值,我们当前在数组中搜索最高读数,并使用索引来确定我们计算中使用的峰值的时间.

如果最高值是我们正在寻找的峰值,则效果很好但是如果设备不能正常工作,我们可以看到第二个峰值可能高于初始峰值.我们在90秒的时间内从16个设备中每秒读取10个读数.

我最初的想法是循环读数检查以查看前一个和下一个点是否小于当前找到峰值并构建一个峰值阵列.也许我们应该查看当前位置两侧的平均点数以允许系统中的噪声.这是最好的方法还是有更好的技巧?


我们使用LabVIEW并且我已经检查了LAVA论坛,并且有许多有趣的例子.这是我们的测试软件的一部分,我们试图避免使用太多的非标准VI库,因此我希望得到有关所涉及的过程/算法的反馈,而不是特定的代码.

language-agnostic algorithm

59
推荐指数
4
解决办法
6万
查看次数

如何检测时间序列数据中的重大变化/趋势?

所以我有一个25个样本的阵列,我希望能够记录它是否从这25个采样时间间隔减少n或增加的趋势(基本上25个样本数组是我的缓冲区,每个说1毫秒填充).

请注意,这是我正在寻找的一般趋势,而不是单个衍生物(正如我将使用有限差分或其他数值微分技术获得).

基本上我希望我的数据有噪音,所以即使在进行过滤等操作之后也可能出现起伏.但这是我正在寻找的增加或减少行为的一般趋势.

我希望在每个ms中集成增加/减少行为以触发某个事件,这更多的是用户界面事件(闪烁LED),因此只要我能检测到一般趋势,它就不必非常延迟处理.

提前致谢!

algorithm statistics numerical signal-processing real-time

26
推荐指数
3
解决办法
3万
查看次数

如何有效地计算移动标准差

下面你可以看到我的C#方法来计算每个点的布林带(移动平均线,上行带,下行带).

如您所见,此方法使用2 for循环来计算移动平均值的移动标准偏差.它曾经包含一个额外的循环来计算过去n个时期的移动平均值.我可以通过在循环开始时将新的点值添加到total_average并删除循环结束时的i-n点值来删除.

我现在的问题基本上是:我可以用移动平均线管理的类似方式删除剩余的内部循环吗?

    public static void AddBollingerBands(SortedList<DateTime, Dictionary<string, double>> data, int period, int factor)
    {
        double total_average = 0;

        for (int i = 0; i < data.Count(); i++)
        {
            total_average += data.Values[i]["close"];

            if (i >= period - 1)
            {
                double total_bollinger = 0;
                double average = total_average / period;

                for (int x = i; x > (i - period); x--)
                {
                    total_bollinger += Math.Pow(data.Values[x]["close"] - average, 2);
                }

                double stdev = Math.Sqrt(total_bollinger / period);

                data.Values[i]["bollinger_average"] = average;
                data.Values[i]["bollinger_top"] = …
Run Code Online (Sandbox Code Playgroud)

c# algorithm finance moving-average standard-deviation

20
推荐指数
2
解决办法
2万
查看次数

噪声正弦时间序列中的实时峰值检测

我一直在尝试实时检测正弦时间序列数据中的峰值,但是到目前为止我还没有成功。我似乎找不到一种实时算法,可以以合理的准确度检测正弦信号中的峰值。我要么没有检测到峰值,要么在正弦波上有无数个点被检测为峰值。

对于类似于正弦波并且可能包含一些随机噪声的输入信号,有什么好的实时算法?


作为一个简单的测试案例,考虑一个频率和幅度始终相同的固定正弦波。(确切的频率和幅度无关紧要;我随意选择了 60 Hz 的频率,+/- 1 个单位的幅度,采样率为 8 KS/s。)以下 MATLAB 代码将生成这样的正弦曲线信号:

dt = 1/8000;
t  = (0:dt:(1-dt)/4)';
x  = sin(2*pi*60*t);
Run Code Online (Sandbox Code Playgroud)

使用Jean-Paul 开发和发布的算法,我要么没有检测到峰值(左),要么检测到无数个“峰值”(右):

我已经尝试了我能想到的这 3 个参数的几乎所有值组合,遵循让-保罗给出的“经验法则”,但到目前为止我还没有得到我预期的结果。


我找到了由 Eli Billauer 开发和发布的替代算法,它确实给了我想要的结果——例如

尽管 Eli Billauer 的算法要简单得多并且确实能够可靠地产生我想要的结果,但它并不适合实时应用程序。


作为我想应用此类算法的信号的另一个示例,请考虑 Eli Billauer 为他自己的算法给出的测试用例:

t = 0:0.001:10;
x = 0.3*sin(t) + sin(1.3*t) + 0.9*sin(4.2*t) + 0.02*randn(1, 10001);
Run Code Online (Sandbox Code Playgroud)

这是一个更不寻常(不太均匀/规则)的信号,具有变化的频率和幅度,但通常仍是正弦波。绘制时,峰值对眼睛来说是显而易见的,但很难用算法识别。


正确识别正弦输入信号中的峰值的好的实时算法是什么?在信号处理方面,我并不是真正的专家,因此获得一些考虑正弦输入的经验法则会很有帮助。或者,也许我需要修改例如 Jean-Paul 的算法本身,以便在正弦信号上正常工作。如果是这种情况,需要进行哪些修改,我将如何进行这些修改?

algorithm matlab signal-processing time-series data-analysis

7
推荐指数
1
解决办法
3621
查看次数

Calculate Heart Rate from ECG Stream - java/Nymi Band

I'm trying to use the ECG data stream provided by a Nymi Band to calculate a users Heart Rate. My current approach is to obtain a 10 second sample of ECG data via the Nymi Bands ECG stream, check for the heart beats and multiply by 6 to get the BPM. By subtracting the previous value from the current value and storing it an a List, I get a pretty accurate graph of the ECG stream. The problem is that …

java android signal-processing

6
推荐指数
1
解决办法
2476
查看次数

计算Python中的直方图峰

在Python中,如何计算直方图的峰值?

我尝试了这个:

import numpy as np
from scipy.signal import argrelextrema

data = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 1, 2, 3, 4,

        5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9,

        12,

        15, 16, 17, 18, 19, 15, 16, 17, 18, 

        19, 20, 21, 22, 23, 24,]

h = np.histogram(data, bins=[0, 5, 10, 15, 20, 25])
hData = h[0]
peaks = argrelextrema(hData, np.greater)
Run Code Online (Sandbox Code Playgroud)

但是结果是:

(array([3]),) …
Run Code Online (Sandbox Code Playgroud)

python

6
推荐指数
3
解决办法
8115
查看次数

使用Swift进行生长时间序列的峰值检测

有人会有一个很好的算法来测量使用Swift(v3)增长时间序列数据的峰值吗?因此,在数据流入时检测峰值.

例如,平滑z波算法的Swift版本.该算法似乎是合适的.

我需要检测峰值,如下所示.数据包含正数和负数.输出应该是峰值的计数器,和/或该特定样本的真/假.

在此输入图像描述

样本数据集(最后一个系列的摘要):

let samples = [0.01, -0.02, -0.02, 0.01, -0.01, -0.01, 0.00, 0.10, 0.31,
  -0.10, -0.73, -0.68, 0.21, 1.22, 0.67, -0.59, -1.04, 0.06, 0.42, 0.07, 
  0.03, -0.18, 0.11, -0.06, -0.02, 0.16, 0.21, 0.03, -0.68, -0.89, 0.18, 
  1.31, 0.66, 0.07, -1.62, -0.16, 0.67, 0.19, -0.42, 0.23, -0.05, -0.01,
  0.03, 0.06, 0.27, 0.15, -0.50, -1.18, 0.11, 1.30, 0.93, 0.16, -1.32, 
  -0.10, 0.55, 0.23, -0.03, -0.23, 0.16, -0.04, 0.01, 0.12, 0.35, -0.38,
  -1.11, 0.07, 1.46, 0.61, -0.68, -1.16, 0.29, …
Run Code Online (Sandbox Code Playgroud)

algorithm signal-processing time-series swift

5
推荐指数
1
解决办法
2411
查看次数

智能峰值检测方法

我想使用 python 从这些数据中检测峰值:

data = [1.0, 0.35671858559485703, 0.44709399319470694, 0.29438948200831194, 0.5163825635166547, 0.3036363865322419, 0.34031782308777747, 0.2869558046065574, 0.28190537831716, 0.2807516154537239, 0.34320479518313507, 0.21117275536958913, 0.30304626765388043, 0.4972542099530442, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.18200891715227194, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, …
Run Code Online (Sandbox Code Playgroud)

python signal-processing numpy matplotlib

5
推荐指数
1
解决办法
6160
查看次数