You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于ALS传感器室内定位:如何计算折线图相似性评分

滑动窗口匹配+相似性评分方案

针对你用ALS传感器数据做位置推断的需求,这里给出具体的数学对比和实现思路,直接解决轨迹区段匹配的问题:

1. 先做好数据对齐预处理

  • 确保你的房间指纹数组(多次步行平均后的结果)和步行轨迹数组的采样间隔完全一致——你已经做了样条插值和Nyquist采样,这一步只需要统一两者的长度维度:假设房间指纹长度为N,轨迹数据长度为M(必然M > N),都转为固定采样率的一维NumPy数组。
  • 对两组数据做归一化处理(比如Z-score:(x - np.mean(x)) / np.std(x)),消除不同时段整体亮度差异的影响,只关注波形趋势的匹配——这一步对环境光数据的相似性判断至关重要。

2. 滑动窗口计算相似性评分

用滑动窗口遍历整个轨迹数据,每次截取和房间指纹长度相同的片段,计算两者的相似性。推荐三种评分方式:

方法1:均方根误差(RMSE)

这是你提到的方法,数值越小代表片段和指纹越相似:

import numpy as np

def sliding_rmse(trajectory, fingerprint):
    fp_len = len(fingerprint)
    traj_len = len(trajectory)
    rmse_scores = np.zeros(traj_len - fp_len + 1)
    
    for idx in range(traj_len - fp_len + 1):
        window = trajectory[idx:idx+fp_len]
        rmse_scores[idx] = np.sqrt(np.mean((window - fingerprint)**2))
    
    return rmse_scores

方法2:皮尔逊相关系数

衡量两个序列的趋势一致性,数值越接近1,代表波形趋势越匹配(适合环境光这种随场景变化有明显趋势的数据):

from scipy.stats import pearsonr

def sliding_correlation(trajectory, fingerprint):
    fp_len = len(fingerprint)
    traj_len = len(trajectory)
    corr_scores = np.zeros(traj_len - fp_len + 1)
    
    for idx in range(traj_len - fp_len + 1):
        window = trajectory[idx:idx+fp_len]
        corr, _ = pearsonr(window, fingerprint)
        corr_scores[idx] = corr
    
    return corr_scores

方法3:动态时间规整(DTW)

如果担心步行速度波动导致的片段时间错位,可以用DTW弹性对齐两个序列,计算更鲁棒的距离(计算量略大,但适合非严格同步的序列):

from scipy.spatial.distance import euclidean
from fastdtw import fastdtw  # 需要先安装:!pip install fastdtw

def sliding_dtw(trajectory, fingerprint):
    fp_len = len(fingerprint)
    traj_len = len(trajectory)
    dtw_scores = np.zeros(traj_len - fp_len + 1)
    
    for idx in range(traj_len - fp_len + 1):
        window = trajectory[idx:idx+fp_len]
        distance, _ = fastdtw(window, fingerprint, dist=euclidean)
        dtw_scores[idx] = distance
    
    return dtw_scores

3. 定位轨迹中的最相似区段

  • 对RMSE/DTW评分:取最小值对应的索引,就是轨迹中与房间指纹最匹配的区段起始位置。
  • 对皮尔逊相关系数:取最大值对应的索引。
  • 用Plotly可视化验证:
import plotly.graph_objects as go

# 假设trajectory_data是处理后的轨迹数组,room_fingerprint是房间指纹数组
rmse_scores = sliding_rmse(trajectory_data, room_fingerprint)
best_idx = np.argmin(rmse_scores)
match_segment = trajectory_data[best_idx:best_idx+len(room_fingerprint)]

fig = go.Figure()
# 绘制完整轨迹
fig.add_trace(go.Scatter(y=trajectory_data, name='ALS Trajectory', line=dict(color='blue')))
# 绘制匹配区段
fig.add_trace(go.Scatter(y=match_segment, name='Best Match', line=dict(color='red', dash='dash')))
# 绘制RMSE评分曲线(右侧Y轴)
fig.add_trace(go.Scatter(y=rmse_scores, name='RMSE Scores', yaxis='y2', line=dict(color='green')))

fig.update_layout(
    title='ALS Trajectory vs Room Fingerprint Match',
    yaxis2=dict(overlaying='y', side='right', title='RMSE'),
    yaxis=dict(title='ALS Value')
)
fig.show()

4. 额外优化建议

  • 提升指纹稳定性:对多次采集的同房间ALS数据,先做时间对齐再取平均,生成更鲁棒的房间指纹。
  • 过滤无效区段:结合加速度计数据,先识别轨迹中的步行时段,只在这些时段内做匹配,减少计算量和干扰。
  • 多指纹批量匹配:如果有多个房间的指纹,可以一次性计算轨迹与所有指纹的相似性,取最高评分对应的房间和区段。

内容的提问来源于stack exchange,提问作者nosilak0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:22:40