- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我有一个 X 和 Y 数组:
X = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
和
Y = np.array([-19.9, -19.6, -17.6, -15.9, -19.9, -18.4, -17.7, -16.6, -19.5, -20.4, -17.6, -15.9])
我得到这样的情节:
这里有 3 个非常清晰的峰,我可以看到。我可以使用以下方法拟合这些数据:
# fit polynomial
z = np.polyfit(X1, Y, 8)
f = np.poly1d(z)
# calculate new x's and y's
x_new = np.linspace(X[0], X[-1], 100)
y_new = f(x_new)
我可以获得以下显示一年中信号变化的信息 - 在这种情况下是水稻农业和农业周期数(3 个峰值):
在这里,我使用 scipy.signal.argrelextrema 来查找曲线的波峰和波谷。然而,要获得一个很好拟合的曲线是一种非常“手动”的方法,我必须先用眼睛解释数据,以便选择多项式阶数。我将在许多数据集(100,000 个)上重复此过程,因此无法每次都手动执行此操作。
此外,我拥有的峰数很可能会发生变化。事实上,我的最终目标是将我拥有的数据集分类为我可以检测到的峰值数量。也有信号有更多噪声的情况。
我研究了 scipy.signal.find_peaks(和相关算法),但它找到了每个峰值,而不仅仅是主要峰值,尤其是在噪声较大的数据中。我还研究了 savgol 滤波器和高斯滤波器,并且能够得到结果,但通常必须指定多项式等的阶数,这可能会随着峰值的数量而变化。
有没有一种方法可以平滑信号以获得峰值数量的近似值,而无需手动指定多项式阶数等?是否有可用的算法/方法可以在没有太多用户输入的情况下检测一般趋势?
如果有比曲线拟合更好的方法,我也愿意接受其他方法。我担心我得到的结果只会和我输入的一样好,因此任何通用的曲线拟合方法都会产生较差的结果。
最佳答案
这是一个使用您的数据和一个简单方程的图形拟合器,一个带有偏移的傅里叶级数 1 项,似乎可以自动平滑拟合。
import numpy, scipy, matplotlib
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
xData = numpy.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0])
yData = numpy.array([-19.9, -19.6, -17.6, -15.9, -19.9, -18.4, -17.7, -16.6, -19.5, -20.4, -17.6, -15.9])
# Fourier Series 1 Term (scaled X) from zunzun.com
def func(x, offset, a1, b1, c1):
return a1 *numpy.sin(c1 * x) + b1 *numpy.cos(c1 * x) + offset
# these are the same as the scipy defaults
initialParameters = numpy.array([1.0, 1.0, 1.0, 1.0])
# curve fit the test data
fittedParameters, pcov = curve_fit(func, xData, yData, initialParameters)
modelPredictions = func(xData, *fittedParameters)
absError = modelPredictions - yData
SE = numpy.square(absError) # squared errors
MSE = numpy.mean(SE) # mean squared errors
RMSE = numpy.sqrt(MSE) # Root Mean Squared Error, RMSE
Rsquared = 1.0 - (numpy.var(absError) / numpy.var(yData))
print('Parameters:', fittedParameters)
print('RMSE:', RMSE)
print('R-squared:', Rsquared)
print()
##########################################################
# graphics output section
def ModelAndScatterPlot(graphWidth, graphHeight):
f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)
axes = f.add_subplot(111)
# first the raw data as a scatter plot
axes.plot(xData, yData, 'D')
# create data for the fitted equation plot
xModel = numpy.linspace(min(xData), max(xData))
yModel = func(xModel, *fittedParameters)
# now the model as a line plot
axes.plot(xModel, yModel)
axes.set_xlabel('X Data') # X axis data label
axes.set_ylabel('Y Data') # Y axis data label
plt.show()
plt.close('all') # clean up after using pyplot
graphWidth = 800
graphHeight = 600
ModelAndScatterPlot(graphWidth, graphHeight)
关于python - 平滑信号并找到峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56332765/
我尝试获取processID的峰值(win7音频混音器中绿色条的电平),例如5640-Spotify。 在互联网上搜索了一个好的图书馆。我找到了CSCore。 现在我有这个: class Progra
这里描述并回答了问题:https://groups.google.com/forum/#!topic/redis-db/egyA1xvhGfo 很遗憾,我没有完全理解答案。 我担心的是,如果 Redi
我有一些音频数据(浮点数数组),我用它来绘制一个简单的 波形。 绘制时,波形不会在边缘达到最大值。 没问题 - 数据只需要标准化。我迭代一次以找到最大值,然后再次迭代将每个除以最大值。再次绘制,一切看
将数组划分为最大数目的相同大小的块,每个块应包含一个索引P,以使A [P-1] A [P + 1]。 我的解决方案:golang solution 但是部分性能测试无故失败,有人可以提出一些建议吗?
我们有一个专用的数据库服务器,在 linux debian 上运行 PostgreSQL 8.3。定期查询数据库以获取大量数据,同时更新/插入也经常发生。数据库会周期性地在短时间内(例如 10 秒)不
我正在使用此 python 代码的稍微修改版本来进行频率分析: FFT wrong value? 假设我在时域中有一组正弦波,它们的频率非常接近,同时共享相同的振幅。这是它们在频域中的样子,对 102
我正在尝试找到一种方法使现有(专有)Linux 进程消耗大量 CPU 或使其过于繁忙以致于停止响应其他进程但不重新生成。 目前我所拥有的只是它在用户空间中的 pid。也许对进程的某种超快速 ping
我们在应用程序中使用 Redis 处理一些数据,这非常棒。不过,我注意到 redis-server 进程偶尔会出现 cpu 和内存峰值。 这是 Giraffe dashboard来 self 们的生产
我有一个 SwiftUI 项目和一个绑定(bind)到 EnvironmentObject 的 View 。该对象包含一个@Published 属性。 import Foundation class
我们目前使用的 VMOptions 如下所示,用于我们使用 spring webflux 设计的微服务之一。我们目前为每个 pod 预留了 4 个 CPU 和 5 GB 内存。 -Xms4096m -
我们目前使用的 VMOptions 如下所示,用于我们使用 spring webflux 设计的微服务之一。我们目前为每个 pod 预留了 4 个 CPU 和 5 GB 内存。 -Xms4096m -
我正在拼命寻找由于 CPU 峰值(18-19 个核心,100% 负载)导致的 Eclipse 卡住瞬间(最多 2-3 秒)的问题。在峰值期间什么都不起作用,整个 eclipse 只是没有反应。自从我修
我的工作涉及振动,我试图从 FFT 幅度中获取以下信息: 峰值到峰值 峰值 RMS 我正在对一个简单的正弦波函数执行 FFT,考虑汉宁窗。请注意,正弦波函数的“全振幅”为 5,运行 FFT 下面的代码
我们有一个位于负载平衡器后面的服务器池。这个池中的机器平均每 6 秒进行一次垃圾收集。垃圾收集需要将近半秒的时间。我们还看到在垃圾收集期间出现 CPU 峰值。 客户端计算机在一天内连接到服务器的平均时
有人知道为什么我们的 Amazon RDS 数据库的 CPU 使用率每小时会出现峰值吗?我们没有每小时运行任何 cron,因此它似乎是一些内部 RDS 的东西,因为它恰好是每小时运行一次。 RDS 是
我试图发现为什么 mysqld 有时会使 cpu 饱和并停止。 我怀疑这与更新索引或其他此类维护有关。我想证明这个假设并寻找避免它的选项。 情况是这样的。我有几十张 table ,但根据事件,似乎至少
已解决 在我们的例子中,问题是对于 SuggestRequestHandler (requestHandler name="/suggest") 现在已经设置了 facelimit:10此外,应用程序
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我正在尝试使用 ALSA 和 C 检索当前音频峰值。我希望将该值作为 0.0 到 1.0(或者可能是 0 到 100)之间的标量。在 Windows 上我使用 IAudioMeterInformati
我是一名优秀的程序员,十分优秀!