17、数据收集与处理的实用技术与应用

数据收集与处理的实用技术与应用

1. 线性模型与数据校准

在数据处理中,我们可以使用线性模型来描述数据。以 ir_data.csv 文件为例,我们将 pairs 列表作为 linest() 函数的参数,该函数会返回相关性 r 以及线性模型的参数 alpha beta 。计算 值能显示线性模型所解释的方差比例。对于 ir_data.csv 文件,输出结果如下:

r² = 0.8267
d = -0.12588*raw + 43.90

这表明该公式能预测82%的值。我们可以在Arduino中实现这个公式,从而报告实际距离而非原始电压测量值,这只需对代码进行小修改即可完成额外的距离计算。

校准测量和数据收集设备的步骤如下:
1. 进行一些受控实验以收集数据点。
2. 进行基本统计分析,确定数据的可用部分。
3. 创建线性模型来描述数据。

基于这个校准过程,我们可以修改设备中的软件,持续收集和分析原始数据,确保设备结果有意义。

2. 使用简单滤波器减少噪声

为减少输出的变异性,我们可以使用原始值的移动平均值。指数加权移动平均(EWMA)算法能抑制数据中的小扰动,提供更稳定的读数。

EWMA算法中,加权数据点的核心计算如下:
[ s_i = w \times r_i + (1 - w) \times s_{i-1} ]
其中, w 是权重值,体现了前一个数据点对当前数据点的影响。若 w 为1,前一个值无影响;若 w 为0,初始值是唯一重要的值,新值会被忽略。

第一个数据点 s_0 可以是第一个原始点 r_0 ,不进行转换,该初始值用于启动处理。常见的做法是对前四个值取平均值。

例如,当 w = 1/3 时,每个新点由下一个原始值的1/3和所有先前加权值的2/3组成,这意味着小的变化会被忽略。随着时间回溯,较旧值的有效权重依次为0.666、0.444、0.296、0.197等。

我们可以使用已收集的原始数据来探索该滤波器的影响,以下是一个用于试验不同权重值的函数:

def ewma(row_iter, w=0.4):
    row = next(row_iter)
    r = row.Raw
    s = r
    row.Weighted = s
    yield row
    for row in row_iter:
        r = row.Raw
        s = round(w * r + (1 - w) * s)
        row.Weighted = s
        yield row

这个生成器函数会对 row_iter 序列中每个项目的 Raw 值应用 w = 0.4 的权重。我们使用 next() 函数提取初始项目 row ,用于初始化原始值 r 和加权值序列 s 。这里我们用单个初始值初始化加权序列,也可以对前几个值取无加权平均值。

我们将加权值插入每行数据中,设置每行的 Weighted 属性,然后返回修改后的行。

以下是一个简单的脚本,用于查看 ewma() 生成器函数的效果:

from ch_5_ex_3 import nsreader
with open("irdata_2.csv") as data:
    for row in ewma(nsreader(data)):
        print(row.Raw, row.Weighted)

运行该脚本,我们会看到原始值和加权值的序列,例如:

300 300
299 300
301 300

原始值在299到301之间波动,而加权值保持稳定在300。另一个例子:

300 300
301 300
300 300
288 295
288 292
289 291

在这个例子中,红外阅读器到目标的距离从300突然跳到288(从15厘米到16厘米),加权移动平均值通过300、295、292和291缓慢下降。加权移动平均的优点是能抑制小变化,减缓大变化。

我们可以在Arduino中轻松实现这个算法,并结合线性模型将加权值转换为距离,从而得到缓慢变化的距离测量值。

3. 添加声音警报解决问题

我们可以使用LED提供反馈,例如使用心跳LED显示代码是否正常运行。还可以根据其他条件添加LED,比如添加红色和绿色LED来显示测量距离是否超出特定范围。

添加这些LED时,需要添加适当的电阻,并分配两个引脚来控制它们。

在Arduino程序中,我们可以通过简单计算将原始测量值转换为距离,代码示例如下:

float next = debounce_ir();
float raw = next * w + (1 - w) * current; 
float d = -0.12588 * raw + 43.90;

这里依赖于 debounce_ir() 函数从红外设备读取单个距离值,这是对 gather_data() 函数的小修改,我们希望返回一个值而不是更新全局变量。

我们使用EWMA算法计算原始值序列的加权移动平均值,将其保存在全局变量 raw 中,权重值 w 通过Python程序探索数据得到。然后将其转换为距离值 d ,用于点亮一些LED。

我们可以在 if 语句中使用这个距离值:

if (d < 16.0) {
    digitalWrite(RED_LED, HIGH);
} else {
    digitalWrite(RED_LED, LOW);
}
if (d > 29.0) {
    digitalWrite(GREEN_LED, HIGH);
} else {
    digitalWrite(GREEN_LED, LOW);
}

这需要定义用于红色和绿色限制LED的两个引脚,我们可以进行实验,确保当目标离传感器太近或太远时LED亮起。

我们还可以添加一个压电扬声器,使用Arduino的 tone() noTone() 函数创建声音信号。注意,扬声器需要一个小电阻(通常为100Ω)来将电压降低到可管理的水平。

使用 tone() 函数时,我们可以提供一个频率(如1000)和持续时间(1000毫秒或1秒),产生一个方便的蜂鸣声作为音频警报。

在开始这类任务时,很难确定最终需要什么样的反馈,是单个警报LED、两个限制LED、一个音调还是多个音调,只有在设备运行时才能想象出确切的反馈需求。能够轻松更改设备使我们可以试验不同类型的交互。

4. 数据收集与处理的其他应用

除了上述内容,数据收集与处理还有很多其他应用场景。以下是一些常见的方面:

4.1 日志文件数据提取与分析

许多软件(包括数据库和Web服务器)会保留大量日志。创建网站的人可以访问显示网站哪些部分被访问的日志。这些数据量很大,Python工具是消化和总结这些细节的常用方法。

4.2 社交网络信息获取

社交网络是获取信息的重要来源。我们可以通过各种社交网络与他人建立联系,例如使用 http://www.meetup.com 等网站找到线下团体,使用关键词(如Python、Arduino或Maker)搜索志同道合的团体。

一些社交网络网站(如 https://twitter.com )有非常复杂的应用程序编程接口(API),我们可以使用这些API找到所需的信息。而其他一些社交网络网站可能不太复杂,需要更多工作来分析和解释数据。

4.3 复杂数据源处理

在某些情况下,我们需要处理难以分析的数据源,例如PDF文件。虽然PDF文件可能包含大量有用信息,但解析起来可能很困难。 pdfminer 包似乎在提取可能被锁定在PDF中的数据方面提供了一定的灵活性。

4.4 物联网数据收集

我们可以利用物联网收集数据。许多人发现,原始数据不如经过适当分析和总结的数据有用,真正成功的做法是将原始数据转化为可操作的信息。

以下是一个简单的流程图,展示了数据收集与处理的主要流程:

graph LR
    A[数据收集] --> B[数据校准]
    B --> C[噪声处理]
    C --> D[数据应用(如LED反馈、声音警报)]
    A --> E[日志文件分析]
    A --> F[社交网络信息获取]
    A --> G[复杂数据源处理]

总的来说,数据收集和处理是一个多方面的过程,涉及到从数据收集到分析、应用的多个环节。通过合理运用线性模型、滤波器、LED反馈和声音警报等技术,我们可以更好地处理和利用数据,同时结合物联网和各种数据源,获取更有价值的信息。

5. 数据处理相关技术总结

在数据处理过程中,我们运用了多种技术和方法,下面对这些关键技术进行总结:

技术名称 作用 操作步骤
线性模型 描述数据关系,预测数据 1. 进行受控实验收集数据点;2. 进行基本统计分析确定可用数据;3. 创建线性模型;4. 根据模型修改设备软件
指数加权移动平均(EWMA)滤波器 减少数据噪声,提供稳定读数 1. 确定权重值 w ;2. 初始化第一个数据点;3. 按照公式 ( s_i = w \times r_i + (1 - w) \times s_{i-1} ) 计算加权数据点;4. 使用Python函数进行实验和应用
LED反馈 直观显示数据状态 1. 添加适当电阻和分配引脚;2. 将原始测量值转换为距离;3. 根据距离值控制LED亮灭
声音警报 提供音频反馈 1. 添加压电扬声器和电阻;2. 使用 tone() noTone() 函数创建声音信号

这些技术相互配合,使得数据处理更加准确和有效。例如,线性模型为数据提供了理论基础,EWMA滤波器提高了数据的稳定性,LED反馈和声音警报则增强了数据的可视化和可感知性。

6. 代码示例分析

下面对前面提到的关键代码进行详细分析:

6.1 EWMA滤波器Python代码
def ewma(row_iter, w=0.4):
    row = next(row_iter)
    r = row.Raw
    s = r
    row.Weighted = s
    yield row
    for row in row_iter:
        r = row.Raw
        s = round(w * r + (1 - w) * s)
        row.Weighted = s
        yield row
  • 代码功能 :该函数实现了EWMA滤波器,对输入的原始数据进行加权处理,返回包含加权值的新数据序列。
  • 代码流程
    1. 提取初始项目 row ,初始化原始值 r 和加权值 s
    2. 将初始加权值插入 row 并返回。
    3. 遍历剩余的 row_iter 序列,计算每个数据点的加权值并插入 row ,然后返回。
6.2 Arduino距离计算和LED控制代码
float next = debounce_ir();
float raw = next * w + (1 - w) * current; 
float d = -0.12588 * raw + 43.90;
if (d < 16.0) {
    digitalWrite(RED_LED, HIGH);
} else {
    digitalWrite(RED_LED, LOW);
}
if (d > 29.0) {
    digitalWrite(GREEN_LED, HIGH);
} else {
    digitalWrite(GREEN_LED, LOW);
}
  • 代码功能 :从红外设备读取距离值,计算加权移动平均值,将其转换为距离值,然后根据距离值控制红色和绿色LED的亮灭。
  • 代码流程
    1. 调用 debounce_ir() 函数读取单个距离值。
    2. 计算加权移动平均值 raw
    3. 根据线性模型将 raw 转换为距离值 d
    4. 根据 d 的值控制LED的亮灭。
7. 数据处理的拓展与展望

数据处理是一个不断发展和拓展的领域,未来有很多可以探索的方向:

7.1 算法优化

可以进一步优化现有的算法,例如改进EWMA滤波器的权重计算方法,使其能够更好地适应不同类型的数据。还可以探索更复杂的线性模型,提高数据预测的准确性。

7.2 多传感器融合

结合多种传感器的数据,如红外传感器、激光传感器等,进行更全面和准确的数据收集。通过融合不同传感器的数据,可以获得更丰富的信息,提高数据处理的效果。

7.3 智能反馈系统

开发更智能的反馈系统,根据数据的实时变化自动调整反馈方式。例如,根据距离的变化动态调整声音警报的频率和强度,或者根据数据的趋势调整LED的颜色和闪烁模式。

以下是一个拓展的流程图,展示了数据处理的未来可能发展方向:

graph LR
    A[数据收集] --> B[数据校准]
    B --> C[噪声处理]
    C --> D[数据应用(如LED反馈、声音警报)]
    A --> E[日志文件分析]
    A --> F[社交网络信息获取]
    A --> G[复杂数据源处理]
    D --> H[算法优化]
    D --> I[多传感器融合]
    D --> J[智能反馈系统]

总之,数据收集与处理是一个充满挑战和机遇的领域。通过不断学习和实践,我们可以掌握更多的数据处理技术,将原始数据转化为有价值的信息,为各个领域的决策提供支持。同时,关注技术的发展趋势,积极探索新的应用场景,将有助于我们在这个领域取得更好的成果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值