如何在Java中使用LibSVM?

如何在Java中使用LibSVM?,java,android,machine-learning,libsvm,rssi,Java,Android,Machine Learning,Libsvm,Rssi,我正在尝试使用蓝牙加密狗实现一个室内位置跟踪系统。这个想法是使用android设备四处走动,并根据房间周围放置的蓝牙狗的信号强度计算您在房间中的位置。 为了做到这一点,我决定使用机器学习尽可能接近RSSI作为距离,例如米。 我大学的一位讲师告诉我,我正在寻找LibSVM,所以我一直在阅读。 我看了一下,似乎无法理解培训系统所需的数据。 我将拥有的数据是: 保存在数据库中的每个加密狗的位置(以及mac地址),x和y坐标 离我的android设备最近的加密狗的接收信号强度指示器(RSSI) mac

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

  • 保存在数据库中的每个加密狗的位置(以及mac地址),x和y坐标
  • 离我的android设备最近的加密狗的接收信号强度指示器(RSSI)
  • mac地址将用于查询数据库中的某些加密狗
我知道数据必须是SVM格式,但我有点不确定输入数据和输出数据应该是什么。下面的例子取自我提到的教程,显示了男人是一个阶级,女人是一个阶级。那么在我的情况下,我会只有一个类“加密狗”吗?所有的加密狗值都应该反映我存储在数据库中的值吗

男配音:低数字:高收入:好

女声:高身材:苗条 收入:车费

  • 将要素值转换为其数值表示形式。比如说,最好的薪水是5,最差的薪水是1(或者没有薪水)= 0),与其他枚举变量相同
  • 我们有两个班,男班和女班。将类转换为数值:man=1,woman=-1
  • 以libsvm数据格式保存:
  • [class/target]1:[firstFeatureValue]2:[secondFeatureValue]等,例如: 一个薪水高、声音低、身材小的女人会被编码 比如: -1:5 2:1.5 3:1.8

    通常,支持向量机的输入文件格式为

    [label][index1]:[value1][index2]:[value2]。。。[标签] [index1]:[value1][index2]:[value2]

    有人能给我举个例子说明我应该瞄准什么吗

    这对我来说都是全新的,所以任何有用的提示或提示都会很好。
    提前感谢

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

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

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


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

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

    有几种算法可以做到这一点,但由于你问的是支持向量机,我会范围 这个答案正好说明了这一点。我假设你的输出只是一个表示距离的值,如果你是 期望有多维输出,并且SVR(支持向量回归)只提供一维输出, 您需要为每个维度训练一个实例

    libsvm的参数之一是svm_类型,因为问题是一个回归问题,您应该使用选项3-ε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
    
    因此,这将转化为(大括号只是为了清楚起见):

    始终建议在[-1,1]或[0,1]之间缩放数据。 此外,您可以在这里找到一些示例数据


    希望这有帮助

    我已经为室内定位实施了WiFi指纹识别,因此我知道这里存在一些问题

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

    由于多径衰落等无线问题,室内三边测量非常困难。这些影响将导致你的信号衰减,这反过来将导致你的距离估计关闭

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

    三边测量的优点是,假设距离估计值是正确的(实际上很难实现),您将能够在连续(非离散)范围内解析您的位置。由于指纹是一个分类问题,它必须分类到一组固定的离散位置之一;例如
    [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]
    
    MAC_1:-87, MAC_2:-40, MAC_3:-91, class=location_A
    MAC_1:-31, MAC_2:-90, MAC_3:-79, class=location_B
    
    MAC_1:-89, MAC_2:-71, MAC_3:-22, class=?