量化曲线的平滑程度
思路
1. 对原始数据一阶求导,得到一阶导数数组。
2. 对一阶导数数组求标准差。导数的标准差提供了导数值的波动性,标准差越小,曲线越平滑。
平滑曲线
import numpy as np import matplotlib.pyplot as plt from matplotlib import font_manager fname="/usr/local/python3.6/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/simhei.ttf" zhfont = font_manager.FontProperties(fname=fname) # 生成示例数据:正弦波加噪声 np.random.seed(123456) time = np.arange(0, 100, 0.1) signal_period = 20 # 正弦波周期 signal = 10 * np.sin(2 * np.pi * time / signal_period) # 正弦波 # 计算一阶导数(离散形式) dt = time[1] - time[0] # 时间步长 first_derivative = np.diff(signal) / dt # 计算一阶导数的统计指标 std_dev_derivative = np.std(first_derivative) # 打印导数的波动性指标 print(f"平滑数据的一阶导数标准差: {std_dev_derivative:.2f}") # 绘制原始信号与导数 plt.figure(figsize=(14, 6)) plt.subplot(2, 1, 1) plt.plot(time, signal, label='平滑数据') plt.xlabel('Time') plt.ylabel('Value') plt.title('原始数据 及其 一阶导数', fontproperties=zhfont, fontsize=12) plt.legend() plt.subplot(2, 1, 2) plt.plot(time[:-1], first_derivative, label='一阶导数', color='orange') plt.xlabel('Time') plt.ylabel('Value') # plt.title('原始数据求导', fontproperties=zhfont, fontsize=12) plt.legend() plt.show() # 绘制导数的直方图 plt.figure(figsize=(14, 4)) plt.hist(first_derivative, bins=50, color='orange', edgecolor='k', alpha=0.7) plt.xlabel('Derivative Value') plt.ylabel('Frequency') plt.title('一阶导数直方图') plt.show()
毛刺曲线
import numpy as np import matplotlib.pyplot as plt from matplotlib import font_manager fname="/usr/local/python3.6/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/simhei.ttf" zhfont = font_manager.FontProperties(fname=fname) # 生成示例数据:正弦波加噪声 np.random.seed(123456) time = np.arange(0, 100, 0.1) signal_period = 20 # 正弦波周期 signal = 10 * np.sin(2 * np.pi * time / signal_period) # 正弦波 noise = np.random.normal(0, 2, len(time)) # 噪声 signal_with_noise = signal + noise # 计算一阶导数(离散形式) dt = time[1] - time[0] # 时间步长 first_derivative = np.diff(signal_with_noise) / dt # 计算一阶导数的统计指标 std_dev_derivative = np.std(first_derivative) # 打印导数的波动性指标 print(f"毛刺数据的一阶导数标准差: {std_dev_derivative:.2f}") # 绘制原始信号与导数 plt.figure(figsize=(14, 6)) plt.subplot(2, 1, 1) plt.plot(time, signal_with_noise, label='毛刺数据') plt.xlabel('Time') plt.ylabel('Value') plt.title('原始数据 及其 一阶导数', fontproperties=zhfont, fontsize=12) plt.legend() plt.subplot(2, 1, 2) plt.plot(time[:-1], first_derivative, label='一阶导数', color='orange') plt.xlabel('Time') plt.ylabel('Value') # plt.title('原始数据求导', fontproperties=zhfont, fontsize=12) plt.legend() plt.show() # 绘制导数的直方图 plt.figure(figsize=(14, 4)) plt.hist(first_derivative, bins=50, color='orange', edgecolor='k', alpha=0.7) plt.xlabel('Derivative Value') plt.ylabel('Frequency') plt.title('一阶导数直方图') plt.show()
整体对比
import numpy as np import matplotlib.pyplot as plt from matplotlib import font_manager fname="/usr/local/python3.6/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/simhei.ttf" zhfont = font_manager.FontProperties(fname=fname) # 计算一阶离散导数 dt = time[1] - time[0] smooth_derivative = np.diff(signal) / dt noisy_derivative = np.diff(signal_with_noise) / dt # 计算标准差 std_dev_smooth = np.std(smooth_derivative) std_dev_noisy = np.std(noisy_derivative) # 打印结果 print(f"平滑数据一阶导数标准差: {std_dev_smooth:.2f}") print(f"毛刺数据一阶导数标准差: {std_dev_noisy:.2f}") # 绘制信号与导数 plt.figure(figsize=(12, 6)) plt.subplot(2, 1, 1) plt.plot(time, smooth_signal, label='平滑数据', color='blue') plt.plot(time, noisy_signal, label='毛刺数据', color='orange') plt.xlabel('Time') plt.ylabel('Value') plt.title('原始数据对比', fontproperties=zhfont, fontsize=12) plt.legend() plt.subplot(2, 1, 2) plt.plot(time[:-1], smooth_derivative, label='平滑数据一阶导数', color='blue') plt.plot(time[:-1], noisy_derivative, label='毛刺数据一阶导数', color='orange') plt.xlabel('Time') plt.ylabel('Derivative Value') plt.title('一阶导数对比', fontproperties=zhfont, fontsize=12) plt.legend() plt.tight_layout() plt.show() # 绘制导数的直方图 plt.figure(figsize=(12, 4)) plt.subplot(1, 2, 1) plt.hist(smooth_derivative, bins=50, color='blue', edgecolor='k', alpha=0.7) plt.xlabel('Derivative Value') plt.ylabel('Frequency') plt.title('平滑数据一阶导数直方图', fontproperties=zhfont, fontsize=12) plt.subplot(1, 2, 2) plt.hist(noisy_derivative, bins=50, color='orange', edgecolor='k', alpha=0.7) plt.xlabel('Derivative Value') plt.ylabel('Frequency') plt.title('毛刺数据一阶导数直方图', fontproperties=zhfont, fontsize=12) plt.tight_layout() plt.show()
作者:Standby — 一生热爱名山大川、草原沙漠,还有我们小郭宝贝!
出处:http://www.cnblogs.com/standby/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/standby/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。