import { lttb } from './lttb.js'; import { mmba } from './mmba.js'; import { rs } from './rs.js'; import { sws } from './sws.js'; import { us } from './us.js'; export interface DataPoint { x: number; y: number; } /** ## `Sampling` : 数据降采样算法 ### 包含算法 + `LTTB` : 最大三角形三桶算法 + `MMBA` : 模式中位数分桶算法 */ export declare const Sampling: { /** ## `LTTB`(Largest Triangle Three Buckets): 最大三角形三桶算法 LTTB算法适用于需要保留数据总体趋势和主要特征的场景。例如,在显示金融市场的历史价格数据时,需要保留价格走势的整体形态。相比于单桶的短视问题,将有效区域的计算延伸到前后两个桶。 + `优点`: 能最大限度保存图形的趋势,形状和极值 + `缺点`:计算复杂度较高,可能会忽略高频细节。 ### 适用场景 1. 时间序列数据的可视化降维 2. 任何需要展示大量数据趋势的图表 */ LTTB: typeof lttb; /** ## `MMBA`(Mode Median Bucketing Algorithm): 模式中位数分桶算法 根据数据的模式(出现频率最高的值)和分布特征来智能分桶,而不是简单地均匀分桶。 + `优点` : 能更好地保留数据的模式,适用于数据分布不均匀的情况 + `缺点` : 对小数据集可能过拟合,趋势保持相对较弱 ### 适用场景 1. 周期性数据 + 日用电量模式,传感器数据展示 2. 多峰分布数据 + 如股票价格,用户行为数据) */ MMBA: typeof mmba; /** `RS` : (Random Sampling) 随机采样算法 随机采样适用于初步探索性分析或对数据精度要求不高的场景。 ### 适用场景 1. 大规模数据集的快速近似分析 + 对大规模数据采取随机采样,其结果值符合大数定律,可以快速获得一个大致的了解。 2. 数据分布未知或复杂,但需避免人为偏差 3. 机器学习中的训练集构建 @example ```ts // 对随机生成的数据使用RS采样能够得到期望的采样结果 const datalen = 1000 const threshold = Math.floor(datalen / 5) const origindata = Array.from({ length: datalen }, (_, i) => ({ x: i, y: Math.random() * 100 })) const sampled = Sampling.RS(origindata, threshold) assert.equal(sampled.length, threshold) const chartd = render(origindata, sampled) result(() => Deno.writeTextFileSync(new URL('./output/rs.svg', import.meta.url), chartd)) ``` */ RS: typeof rs; /** ## `US`(Uniform Sampling): 均匀采样 按固定间隔从数据集中选择数据点的采样方式。 ### 适用场景 1. 数据本身分布均匀或平稳 : + 在环境传感器数据展示中,均匀采样可以有效减少数据量而不会丢失太多信息。 2. 数据量较大,需要降低数据量以适应硬件限制 : + IoT 设备定期上传传感器数据(每秒采 1000 次 → 每 10 秒传 1 次) 3. 满足`奈奎斯特采样定理`的数据 : + 采样频率大于信号最高频率的两倍,则采样后的数据可以完全恢复原始信号。 */ US: typeof us; /** ## `SWS`(Sliding Window Sampling): 滑动窗口采样 将数据分成固定大小的窗口,在每个窗口内选择`最大值`和`最小值`和`中位数`作为代表点。 ### 适用场景 1. 适用于需要保留局部变化和细节的场景, 具有连续性和局部相关性的数据 : + `心电图`|`脑电图`数据展示需要保留每个窗口内的最大、最小或中位数等特征点。 2. 高频率采集的原始数据 : + 1kHz 采样的传感器数据 → 降为 10Hz 用于可视化或模型输入 @example ```ts interface Point { x: number y: number } //符合奈奎斯特采样定理的数据 function generate_nyquist_compliant_signal( f_max: number, // 信号中的最高频率(Hz) duration: number, // 信号持续时间(秒) safety_factor = 2.2 // 采样频率相对于 2*fMax 的安全倍数 ): Point[] { const fs = safety_factor * 2 * f_max // 采样频率 > 2 * fMax const dt = 1 / fs // 采样间隔 const N = Math.floor(duration * fs) // 采样点数 const dataset: { x: number; y: number }[] = [] for (let i = 0; i < N; i++) { const t = i * dt const amplitude = Math.sin(2 * Math.PI * f_max * t) // 示例:正弦波信号 dataset.push({ x: t, y: amplitude }) } return dataset const freq = 5 //持续5秒的freqHz的正弦波 const origindata = generate_nyquist_compliant_signal(freq, 5) const sampled = Sampling.US(origindata, origindata.length / 2) assert.equal(sampled.length, origindata.length / 2) const chartd = render(origindata, sampled) result(() => Deno.writeTextFileSync(new URL('./output/us.svg', import.meta.url), chartd)) } ``` */ SWS: typeof sws; }; //# sourceMappingURL=mod.d.ts.map