WIFI室内定位——位置指纹法的实现(决策树)

WIFI室内定位——位置指纹法的实现(决策树)

位置指纹法中常用的算法之一是决策树:本文介绍决策树用于定位的基本原理与具体实现(python)。

基本原理

位置指纹法可以看作是分类或回归问题(特征是RSS向量,标签是位置),监督式机器学习方法可以从数据中训练出一个从特征到标签的映射关系模型。
决策树:是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果,本质是一颗由多个判断节点组成的树。决策树主要指CART(classification and regression tree)算法,内部结点特征的取值为“是”和“否”, 为二叉树结构。

  • 决策树回归: 所谓回归,就是根据特征向量来决定对应的输出值。回归树就是将特征空间划分成若干单元,每一个划分单元有一个特定的输出。因为每个结点都是“是”和“否”的判断,所以划分的边界是平行于坐标轴的。对于测试数据,我们只要按照特征将其归到某个单元,便得到对应的输出值。
  • 决策树分类: 能够根据特征值一层一层的将数据集进行分类。它的优点在于计算复杂度不高,分类出的结果能够很直观的呈现,但是也会出现过度匹配的问题。使用ID3算法的决策树分类第一步需要挑选出一个特征值,能够将数据集最好的分类,之后递归构成分类树。使用信息增益,来得到最佳的分类特制。

具体实现

数据采集

地点:图书馆二层
采集方法:根据地面砖块的分布,分成25*25个区域,每一个区域取5个点(砖块的4个顶点和中心1个点),每个点选取5个相对稳定的IP(注意要尽量避免手机移动),共测出125份数据,其中训练数据100份 测试数据随机抽取的25份;

测试集在这里插入图片描述
训练集

|在这里插入图片描述

建立坐标

取中心点为坐标(0,0)点

取中心点为坐标(0,0点
代码实现
导入数据
获取数据,将数据分为训练集和测试集
TrainData = xlrd.open_workbook('train.xlsx')
table = TrainData.sheets()[0]
nrows = table.nrows
ncols = table.ncols
TrainX = [([0] * (ncols - 3)) for p in range(nrows - 1)]
TrainY = [([0] * 1) for p in range(nrows - 1)]
TrainCoor = [([0] * 2) for p in range(nrows - 1)]
for i in range(nrows - 1):
    TrainY[i][0] = table.cell(i + 1, 0).value
    for j in range(ncols - 3):
        TrainX[i][j] = table.cell(i + 1, j + 3).value
    for k in range(2):
        TrainCoor[i][k] = table.cell(i + 1, k + 1).value
X = np.array(TrainX)
Y = np.array(TrainY)
决策树模型
#基于DecisionTreeClassifier模型进行决策分类
>for criterion in ('gini','entropy'):
   classifier = tree.DecisionTreeClassifier(criterion=criterion, max_depth=3, random_state=0) clf =tree.DecisionTreeClassifier(criterion='entropy')  /*核心代码:使用信息熵作为划分标准,对决策树进行训练*/
//*创建决策树模型并设置参数 ‘gini’ or ‘entropy’ (default=”gini”),前者是基尼系数,后者是信息熵。两种算法差异不大对准确率无影响,信息墒云孙效率低一点,因为它有对数运算.一般说使用默认的基尼系数”gini”就可以了,即CART算法。//
   classifier.fit(X, Y.ravel())
    y_pre = classifier.predict(onlineX)
    Error = []
    for i in range(testNrows - 1):
        curPre = int(y_pre[i])
        PredictCoor = [TrainCoor[curPre - 1][0], TrainCoor[curPre - 1][1]]
        temp2 = actualCoor[i,:].astype(np.float)
        temp1 = np.array(PredictCoor)
        temp1 = temp1.astype(np.float)
        Error.append(np.linalg.norm(temp1 - temp2))
利用DecisionTreeClassifier来训练数据
基于DecisionTreeRegressor模型进行决策回归
  for criterion in ('mse', 'friedman_mse', 'mae'):
    classifier = tree.DecisionTreeRegressor(criterion=criterion)
    //criterion使用参数"mse""friedman_mse""mae",前者是均方差,后者是和均值之差的绝对值之和。推荐使用默认的"mse"。一般来说"mse""mae"更加精确。//
    classifier.fit(X, Y.ravel())
    y_pre = classifier.predict(onlineX)

得出结果

由上述结论可知,在决策树分类算法下使用不同参数’gini’和’entropy’的平均误差分别为6.565m和7.3827m;

回归算法下使用不同参数’mse’, ‘friedman_mse’, 'mae’的平均误差分别为7.3756m、7.6099m和6.9966m.
可以看出参数为‘gini’时的平均误差最小。

误差分析

  • 收集的信号并不完全稳定,数据不完全精确;
  • 由于地方限制,数据测试的过程中间隔较小;

源代码以及数据集

训练数据集链接
测试数据集链接
源代码

小组成员:安琳、安睿琦、崔晓熙、王涵颍、王昕

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页