基于WiFi的室内定位(knn/wknn)

发布时间:2026/5/19 0:15:32

基于WiFi的室内定位(knn/wknn) 本文对比了knn和wknn两种算法在室内定位场景下的精确度同时对传统的wknn算法进行了改进。项目获取地址https://mbd.pub/o/bread/mbd-ZJqWl51y一、实验环境实验环境是使用Python编程语言在Python环境中运行。此外该程序还使用了多个Python第三方库包括Pandas用于数据读取和处理。NumPy用于数据处理和数学计算。sklearn用于机器学习模型的训练和评估。Matplotlib用于数据可视化。在程序中使用了KNN和WKNN回归算法分别用于预测三维空间中的位置坐标。程序使用了CSV格式的数据集文件并使用Pandas库读取和处理数据。程序还使用了joblib库来保存训练好的模型。二、程序介绍1、导入必要的库import pandas as pdimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.neighbors import KNeighborsRegressorfrom sklearn.metrics import mean_squared_error, mean_absolute_errorimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dimport joblib这里导入了需要用到的库包括pandas用于数据处理numpy用于数组处理sklearn中的KNeighborsRegressor用于KNN回归模型的构建matplotlib用于数据可视化joblib用于模型保存。2、加载数据集data pd.read_csv(‘dataset1.csv’, sep‘;’)这里使用pandas库中的read_csv()函数读取csv文件并将分隔符设置为’;。读取后的数据保存在data变量中。3、处理特征向量X data.iloc[:, 13:44].replace(‘null’, np.nan).astype(float).fillna(0).values这里选取了data中的第13列到第43列的数据作为特征向量用于训练模型。由于有些数据缺失使用replace()函数将其替换为np.nan然后使用astype()函数将数据类型转换为float最后使用fillna()函数将缺失值替换为04、获取标签x、y、zy_xyz data.iloc[:, 2:5].astype(float).values这里选取了data中的第2列到第4列的数据作为标签即三维坐标的x、y、z值。同样使用astype()函数将数据类型转换为float。5、将数据集分为训练集和测试集X_train, X_test, y_train, y_test train_test_split(X, y_xyz, test_size0.2, random_state42)这里使用sklearn库中的train_test_split()函数将数据集分为训练集和测试集。其中X和y_xyz分别作为特征向量和标签test_size表示测试集的大小比例random_state表示随机种子保证每次运行的结果一致。6、创建KNN回归器knn KNeighborsRegressor(n_neighbors5)这里创建了一个KNN回归器并将n_neighbors参数设置为5表示使用最近的5个邻居来进行预测。7、在训练集上训练回归器knn.fit(X_train, y_train)这里使用fit()函数在训练集上训练KNN回归器。8、在测试集上评估回归器性能y_pred knn.predict(X_test)mse mean_squared_error(y_test, y_pred)rmse np.sqrt(mse)mae mean_absolute_error(y_test, y_pred)print(KNN均方误差 Root Mean Squared Error: , rmse)print(KNN平均绝对误差 Mean Absolute Error: , mae)这里使用predict()函数在测试集上进行预测并使用mean_squared_error()和mean_absolute_error()函数计算预测结果与真实结果之间的均方误差和平均绝对误差输出评估结果。9、定义不同权重函数def inverse_distance(distances):return 1 / distancesdef inverse_distance_squared(distances,epsilon1e-8):distances np.maximum(distances, epsilon) return 1 / distances**2def distance_weight(distances):return 1 / (1 distances)这里定义了三个不同的权重函数用于WKNN回归器的构建。其中inverse_distance()函数返回距离的倒数作为权重inverse_distance_squared()函数返回距离的倒数平方作为权重distance_weight()函数返回距离的倒数加1的倒数作为权重。我们首先使用inverse_distance()、inverse_distance_squared()和distance_weight()函数创建了三个不同的WKNN回归器并分别命名为wknn_id、wknn_ids和wknn_dw。然后我们在训练集上对这三个回归器进行了训练。接着我们使用predict()函数在测试集上进行预测并使用mean_squared_error()和mean_absolute_error()函数分别计算了预测结果和真实结果之间的均方误差和平均绝对误差并将评估结果输出到控制台中。最后我们可以根据输出结果进行模型选择和调整。三、可视化展示三维空间分布图用于展示预测结果和真实结果在三维空间中的分布情况其中蓝色的点表示真实结果红色的点表示预测结果。这个图形化展示可以帮助我们直观地了解预测结果和真实结果的分布情况以及模型是否能够准确地预测三维空间中的结果散点图用于展示预测结果和真实结果在二维平面上的分布情况其中蓝色的点表示真实结果红色的点表示预测结果。这个图形化展示可以帮助我们直观地了解预测结果和真实结果在二维平面上的分布情况以及模型是否能够准确地预测二维平面上的结果。误差分布图用于展示预测结果和真实结果之间的误差分布情况。这个图形化展示可以帮助我们直观地了解模型的误差分布情况以及模型是否能够准确地预测结果。动态可视化用于展示预测结果和真实结果在三维空间中的实时动态分布情况。这个图形化展示可以帮助我们更好地理解模型的性能和预测结果的准确性以及模型在预测过程中的实时表现。四、knn和wknn两者精确度对比KNN均方误差 Root Mean Squared Error: 1.9911102213137062KNN平均绝对误差 Mean Absolute Error: 1.1835281385281382WKNN权重为inverse_distance均方误差 Root Mean Squared Error: 1.9736306217976498WKNN权重为inverse_distance平均绝对误差 Mean Absolute Error: 1.1677008251607548WKNN权重为inverse_distance_squared均方误差 Root Mean Squared Error: 1.9641521326399896WKNN权重为inverse_distance_squared平均绝对误差 Mean Absolute Error: 1.1536246973899613WKNN权重为distance_weight均方误差 Root Mean Squared Error: 1.9742903443363213WKNN权重为distance_weight平均绝对误差 Mean Absolute Error: 1.1685954537506553五、结论wknn比knn更加精确

相关新闻