WK-NNC

news/2025/3/31 13:11:28/

WK_NNC[1]

WK_NNC简介

WK_NNR模型(Distance-Weighted k-Nearest-Neighbor Rule)是Sahibsingh A. Dudani于1976年提出的对KNN(详见KNN | BaoWJ’s Blog)的一种改进方法。

该方法的主要思路是对KNN中的距离进行加权

基础KNN是:直接取距离待预测数据点 α \alpha α 最近的K个点,并预测该数据类别为这K个数据中占比最大的数据的类别。KNN可以看成WK__NNC的一个特例,这相当于对K个数据点中,设置权重都为1

WK_NNR的思路是根据这K个点距离 α \alpha α 的距离不同赋予不同的权重,最后依据权重之和最大的类别来预测。

对于待预测数据点 α \alpha αK个“最近邻” α i , 1 ≤ i ≤ K \alpha_i,1\le i \le K αi,1iK,其中 α i \alpha_i αi 距离 α \alpha α 点的距离为 d i d_i di,且 d 1 ≤ d 2 ≤ ⋯ ≤ d K d_1\le d_2 \le \cdots \le d_K d1d2dK。则,其每个点的权重定义如下:

w i = { d k − d i d k − d 1 d k ≠ d 1 1 d k = d 1 w_i=\left\{\begin{aligned} \frac{d_k-d_i}{d_k-d_1}\quad & d_k \ne d_1\\ 1\quad &d_k=d_1\end{aligned}\right. wi=dkd1dkdi1dk=d1dk=d1

最终 α \alpha α预测类别权重加和值最大的数据的类别。

WK_NNC代码

因为sklearn没有提供WK_NNR模型的库函数,所以这里我基于sklearnKNeighborsClassifier类构造WK_NNR模型。

KNeighborsClassifier提供了一个weights参数接口,用户可以通过自定义函数来自定义距离权重,所以我写了一个基于WK_NNR权重的自定义函数kw_nnc,代码如下:

def kw_nnc(distances):return ((distances[:, -1][:, np.newaxis] - distances) + 1e-6) / ((distances[:, -1] - distances[:, 0])[:, np.newaxis] + 1e-6) # 1e-6为了防止除0发生wk_nnc_model = KNeighborsClassifier(weights=kw_nnc)

WK_NNC实验

实验数据

  • 数据来源:http://www.cad.zju.edu.cn/home/dengcai/Data/TDT2/TDT2.mat

  • 数据简介:该数据是新闻文本数据,数据的作者从新闻文本中提取出的词频数据。。

  • 数据维度:36771;

  • 类别数:30;

  • 数据条数:9394;

实验代码

导入依赖包

import scipy.io as scio
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection  import cross_val_score
from sklearn.metrics import confusion_matrix, accuracy_score
from sklearn.model_selection import train_test_split

加载数据

dataFile = './TDT2.mat'
data = scio.loadmat(dataFile)
Y = data['gnd'].ravel()
X = data['fea'].Aprint('X shape:', X.shape)
print('Y shape:', Y.shape)

TF-IDF

from sklearn.feature_extraction.text import TfidfTransformertfidf = TfidfTransformer()
X = tfidf.fit_transform(X).A

寻找最优K值

import matplotlib.pyplot as pltdef get_best_k_acc(X_train, Y_train, X_test, Y_test):acc_list = []k_list = []model = KNeighborsClassifier(weights=kw_nnc)for k in range(5, 16, 1):model.n_neighbors = kmodel.fit(X_train, Y_train)Y_pred = model.predict(X_test)acc = accuracy_score(Y_test, Y_pred)k_list.append(k)acc_list.append(acc)plt.plot(k_list, acc_list)plt.ylabel('Accuracy')plt.title('Accuracy with K')plt.xlabel('K')plt.show()# 计算最优Kbest_acc = np.max(acc_list)best_k = k_list[np.argmax(acc_list)]print('最优k值为: {}, value为: {}'.format(best_k, best_acc))return (best_k, best_acc)

寻找最优降维维度

from sklearn.decomposition import PCA
acc_list = []
k_list = []
n_list = []
pca_model = PCA()
for n in range(1, 11, 1):# 降维n = n * 10print('-' * 15 + '维度为' + str(n) + '-' * 15)pca_model.n_components = nprint('-' * 15 + '开始降维' + '-' * 15)pca_X = pca_model.fit_transform(X)print('降维后形状:', pca_X.shape)# 划分数据集print('-' * 15 + '开始切分数据' + '-' * 15)X_train, X_test, Y_train, Y_test = train_test_split(pca_X, Y, test_size=0.25, random_state=21, shuffle=True)print('训练数据:', X_train.shape)print('训练label:', Y_train.shape)print('测试数据:', X_test.shape)print('测试label', Y_test.shape)k, acc = get_best_k_acc(X_train, Y_train, X_test, Y_test)k_list.append(k)acc_list.append(acc)n_list.append(n)

绘图

import matplotlib.pyplot as pltplt.title('K-NNMC')
plt.subplot(2, 1, 1)
plt.xlim(0, 105)
plt.ylim(0.96, 0.98)
plt.scatter(n_list, acc_list)
plt.plot(n_list, acc_list)
for x, y in zip(n_list, acc_list):plt.text(x, y + 0.001, "%.3f"%y)
plt.ylabel('Accuracy')
plt.grid()
plt.title('Best_Accuracy with Dim')
plt.xlabel('Dim')plt.subplot(2, 1, 2)
plt.scatter(n_list, k_list)
plt.plot(n_list, k_list)
for x, y in zip(n_list, k_list):plt.text(x, y + 0.1, "%d"%y)
plt.ylabel('K')
plt.grid()
plt.title('Best_K with Dim')
plt.xlabel('Dim')
plt.show()

实验结果

请添加图片描述

结果发现,WK_NNC模型取的最优值的地方K值都比较大(在10附近),说明WK_NNC模型泛化性比较好。

链接

  • KNN | BaoWJ’s Blog
  • K-NNMC | BaoWJ’s Blog

引用

[1] S. A. Dudani, "The Distance-Weighted k-Nearest-Neighbor Rule," in IEEE Transactions on Systems, Man, and Cybernetics, vol. SMC-6, no. 4, pp. 325-327, April 1976, doi: 10.1109/TSMC.1976.5408784.

http://www.ppmy.cn/news/173509.html

相关文章

ov2656

android v2.2 linux v2.6.32 board DM3730 sensor ov2656 参考: 《Android 底层开发技术实战详解》 在OMAP平台中,可以使用高级的ISP(图像信号处理)模块通过外接i2c方式连接的Camera Sensor驱动 来获得视频帧的数据 drivers/media…

4N65-ASEMI高压N沟道MOS管4N65

编辑:ll 4N65-ASEMI高压N沟道MOS管4N65 型号:4N65 品牌:ASEMI 封装:TO-220 最大漏源电流:4A 漏源击穿电压:650V RDS(ON)Max:2.5Ω 引脚数量:3 沟道类…

16N65-ASEMI高压MOS管16N65

编辑-Z 16N65在TO-220封装里的静态漏极源导通电阻(RDS(ON))为0.55Ω,是一款N沟道高压MOS管。16N65的最大脉冲正向电流ISM为64A,零栅极电压漏极电流(IDSS)为1uA,其工作时耐温度范围为-55~150摄氏度。16N65功耗&#xf…

android 停止一段时间,repo sync 工作一段时间后就停止了

$?1; while [ $? -ne 0 ] ; do repo sync ; done 然后repo sync 工作一段时间后就不动了: Fetching projects: 95% (210/221) Fetching project platform/prebuilt Fetching project platform/sdk Fetching project platform/system/bluetooth Fetching project…

NRZ、NRZI编码

RZ 编码(Return-to-zero Code): 归零编码。 在 RZ 编码中,正电平代表逻辑 1,负电平代表逻辑 0,每传输完一位数据,信号返回到零电平。 信号线上会出现 3 种电平:正电平、负电平、零…

QNAP 威联通NAS ts-453bmini ups断电自动关机

买了nas,买了ups,突然想起这个ups不能和nas通信,那岂不是无法自动关机,ups不是白买了,本着物尽其用的原则,网上搜了下方案,发现主要思路是nas跑脚本ping路由器或者某个没断电可以正常网络联通的…

ubuntu下面的背光键盘的使用

测试环境: ubuntu18.10-amd64 笔记本电脑:N56VZ echo -n 3 > /sys/class/leds/asus::kbd_backlight/brightness

N56背光键盘排线断裂修复

华硕ASUS N56VZ背光排线在开机箱盖子的时候不小心被暗扣子扯到,然后就扯断了,重新更换背光键盘淘宝需要160. 修复背光键盘,主要有以下两大方案: 一.导电银漆 二.更换"金手指排线" 三.直接飞线 方案一,我试过了,极难操作,而且那个银油漆很难干,还有毒,最后和"金…