数据收集与处理的实用技术与应用
1. 线性模型与数据校准
在数据处理中,我们可以使用线性模型来描述数据。以
ir_data.csv
文件为例,我们将
pairs
列表作为
linest()
函数的参数,该函数会返回相关性
r
以及线性模型的参数
alpha
和
beta
。计算
r²
值能显示线性模型所解释的方差比例。对于
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[智能反馈系统]
总之,数据收集与处理是一个充满挑战和机遇的领域。通过不断学习和实践,我们可以掌握更多的数据处理技术,将原始数据转化为有价值的信息,为各个领域的决策提供支持。同时,关注技术的发展趋势,积极探索新的应用场景,将有助于我们在这个领域取得更好的成果。
超级会员免费看

被折叠的 条评论
为什么被折叠?



