K-NNMC[1]
K-NNMC简介
K-NNMC模型(k-Nearest Neighbor Mean Classifier)是P. Viswanath和T. Hitendra Sarma于2011年提出的对KNN(详见KNN | BaoWJ’s Blog)的一种改进方法。
该方法的主要思路是对KNN中**“选择K个最近邻”进行了改进。该方法针对每个类别的数据都选择K个最近邻**,然后计算每个类别的K个最近邻的距离平均值,并选择距离平均值最小的类别为预测类别。
K-NNMC代码
因为sklearn没有提供K-NNMC模型的库函数,所以这里我基于sklearn的KNeighborsClassifier类构造WK_NNR模型。
因为K-NNMC模型需要分别计算每个类别数据对于待预测数据的K个最近邻,所以我用n(n表示数据类别总数)个KNeighborsClassifier分别处理每类数据,构造了KNeighborsMeanClassifier类,代码如下:
import numpy as np
class KNeighborsMeanClassifier:
def __init__(self, n_neighbors=5) -> None:
self.labels = None
self.classifiers = dict()
self.n_neighbors = n_neighbors
def fit(self, X, y):
self.labels = np.array(list(set(y)))
for label in self.labels:
model = KNeighborsClassifier()
model.fit(X[y == label], y[y == label])
self.classifiers[label] = model
def predict(self, X):
tmp = []
for label in self.labels:
classifier = self.classifiers[label]
mean_dis = classifier.kneighbors(X, n_neighbors=self.n_neighbors)[0]
mean_dis = np.mean(mean_dis, axis=1)
tmp.append(mean_dis)
tmp = np.stack(tmp)
print(tmp.shape)
index = self.labels[np.argmin(tmp, axis=0)]
print(index.shape)
return index
K-NNMC实验
实验数据和实验代码基本同WK_NNC实验(WK-NNC| BaoWJ’s Blog)
实验结果
结果发现效果一般,同时我实现的代码速度较慢。