4

我正在尝试使用蓝牙加密狗实现室内位置跟踪系统。这个想法是带着安卓设备四处走动,并根据房间周围的蓝牙适配器的信号强度计算你在房间中的位置。为了做到这一点,我决定使用机器学习将 RSSI 尽可能地近似为距离,例如米。我大学的一位讲师告诉我,LibSVM 是我正在寻找的东西,所以我一直在阅读。我查看了本教程,似乎无法理解训练系统所需的数据。我将拥有的数据是:

  • 保存在数据库中的每个加密狗的位置(以及 MAC 地址),x 和 y 坐标
  • 离我的 Android 设备最近的加密狗的接收信号强度指示器 (RSSI)
  • mac 地址将用于查询数据库中的某些加密狗

我知道数据必须是 SVM 格式,但我有点不确定它在输入数据和输出数据方面应该是什么。下面的示例取自我提到的教程,表明男人是一个阶级,女人是一个阶级。那么在我的情况下,我只有一个类“加密狗”吗?并且所有值加密狗都应该反映我存储在数据库中的值吗?

男声:低身材:大收入:好

女声:高身材:微薄收入:车费

  1. 将特征值转换为其数值表示。假设最好的薪水是 5,最差的薪水是 1(或没有薪水 = 0),与其他枚举变量相同。
  2. 我们有两个班,男人和女人。将类转换为数值:man = 1,woman = -1
  3. 以 libsvm 数据格式保存:

[class/target] 1:[firstFeatureValue] 2:[secondFeatureValue] etc. 例如:一个薪水高、声音低、身材矮小的女性会被编码为:-1 1:5 2:1.5 3:1.8

通常 SVM 的输入文件格式为

[标签] [索引1]:[值1] [索引2]:[值2] ... [标签] [索引1]:[值1] [索引2]:[值2] ...

有人可以给我一个我应该瞄准的例子吗?

这对我来说都是全新的,所以任何有助于我前进的有用提示或技巧都会很棒。提前致谢

4

3 回答 3

3

我已经为室内定位实现了 WiFi 指纹识别,所以我知道这里的一些问题。

首先,要确定您的位置,您是在执行指纹识别还是信号强度三边测量(人们错误地称之为三角测量)?三边测量是使多个球体相交以在空间中找到位置的过程。另一方面,指纹识别是一个分类问题,它将信号解析到一个没有计算实际距离的位置。

由于多径衰落等无线问题,三边测量在室内极为困难。这些影响会导致您的信号衰减,进而导致您的距离估计值被关闭。

指纹只是一个分类问题。与三边测量一样,它假设加密狗的位置不会改变。但是,与三边测量不同,它根本不使用距离。

三边测量的优点是,假设距离估计是正确的(实际上很难达到),您将能够在连续(非离散)范围内解析您的位置。由于指纹识别是一个分类问题,它必须分类到一组固定的离散位置中的一个;例如,如果您的蓝牙无线电沿着房间的周边布置,您最终可能会将房间内部离散化为 3x3 可能的位置之一。

如果您要进行指纹识别,那么您将需要收集具有如下特征向量的训练数据:

MAC_1:-87, MAC_2:-40, MAC_3:-91, class=location_A
MAC_1:-31, MAC_2:-90, MAC_3:-79, class=location_B

对于房间中的每个位置,您可以从所有可以感应到的可用蓝牙无线电中读取 RSSI。您应该为每个位置至少读取 10 个读数。对于 WiFi,RSSI 值是整数,以分贝为单位,范围为 -100 到 -1(例如,-20 dB 表示您非常靠近收音机)。

现在,当您尝试执行分类时,您将阅读如下内容:

MAC_1:-89, MAC_2:-71, MAC_3:-22, class=?

问题是将这些 RSSI 读数分类到其中一个位置。

在我之前的工作中,我使用了朴素贝叶斯分类器而不是 SVM,因为朴素贝叶斯很容易适应缺失的特征(通过允许你给缺失的特征一个小概率质量)。此外,在朴素贝叶斯中,我使用高斯 PDF 函数来计算似然概率 P(location | MAC_i = RSSI_i),因为所有 RSSI 值都是数字。

于 2013-03-06T20:48:53.337 回答
2

由于您的输出是实数(距离),我们谈论的是回归问题,而不是分类问题。我不清楚您要查找的值是否是到加密狗的最近距离,或者您的输出是否是到所有加密狗的一组距离。这是你需要首先澄清的事情。

有几种算法可以做到这一点,但既然你问的是 SVM,我会把这个答案的范围仅限于此。我假设您的输出只是一个表示距离的值,如果您期望有一个多维输出并且考虑到 SVR(支持向量回归)只提供一维输出,那么您需要在每个维度上训练一个实例。

libsvm 的参数之一是 svm_type,因为问题是回归问题,您应该使用选项 3 - epsilon-SVR

对于内核类型,我建议考虑 RBF(选项 2 - 径向基函数)

至于您的数据,这是一种可能的安排:

| dongle 1           | dongle 2           | dongle 3           | desired output
| x    | y    | RSSI | x    | y    | RSSI | x    | y    | RSSI |   
---------------------------------------------------------------------------------
| 10.0 | 11.1 | 2.3  | 0.0  | 1.1  | 0.3  | 17.0 | 19.1 | 0.3  |     10.3
| 30.0 | 17.1 | 0.3  | 10.0 | 1.1  | 0.9  | 11.0 | 9.1  | 0.2  |     18.7

所以这将转化为(大括号只是为了清楚起见):

[10.3] [1]:[10.0] [2]:[11.1] [3]:[2.3] [4]:[0.0] [5]:[1.1] [6]:[0.3] [7]:[17.0] [8]:[19.1] [9]:[0.3]
[18.7] [1]:[30.0] [2]:[17.1] [3]:[0.3] [4]:[10.0] [5]:[1.1] [6]:[0.9] [7]:[11.0] [8]:[9.1] [9]:[0.2]

始终建议在 [-1, 1] 或 [0, 1] 之间缩放数据。此外,您可以在此处找到一些示例数据http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/regression.html

希望这可以帮助

于 2013-03-06T20:16:11.953 回答
1

我认为您不能使用 SVM 来做您所说的事情(计算您在房间中的位置……) SVM 是一种有监督的二进制分类算法。也就是说,如果你给它一些数据和一些正/负类,它会学习一个分类器,可以告诉你新的、未观察到的数据点是正的还是负的。因此,您可以训练一个 SVM 来告诉您一个人是在房间的一侧还是在另一侧(南侧/北侧),而不是他们的实际位置。

看起来你想做的事情根本不需要机器学习。请参阅以下帖子:

编辑:鉴于您的澄清,我建议使用k-最近邻回归。SVM 绝对不适合你想做的事情;即使使用 SVM 进行回归,它也只能在一维中工作。

您要做的是获取尽可能多的数据(数据 = RSSI,标签 = 距离)并将它们嵌入到度量空间中,可能在您拥有的加密狗数量的维度中。然后,给定一些新数据(RSSI 信号强度),找到空间中最近的邻居并计算距离上的某种平均值。

于 2013-03-06T01:22:49.827 回答