机器学习笔记-KNN
0x00 系列文章目录
摘要
K近邻(KNN),全名为·k nearest neighbours·,即最近的K个邻居。
0x01 简介
- KNN核心思想
找到目标节点最近的K个样本点,将他们的Y值(分类)计数,取最多的那个分类作为目标点的分类结果。 - 是一种无参(这里的无参指KNN不能通过学习得出的参数)模型
- 超参数为人为提前设定的参数K
- 可分别用于分类或回归
- 属于有监督学习
- K不一定为奇数,比如使用距离(比如取倒数,则越近权重越大)加权的表决
0x02 KNN实现步骤
- 利用已有数据作为训练样本,来对样本x进行预测
- 计算 x 和训练集中所有X的距离distances
- 对distances进行排序, 得到排序后的样本(距离度量可用欧氏距离、曼哈顿距离等)
- 选取距离最小的前k个点, 并统计每个类别(Y)出现次数
- 最终返回出现次数最多的那个类别Y(分类规则可选多数表决、加权表决等)作为预测结果
0x03 实现代码
下面是一个简易的KNN代码,K值默认为3,距离度量采用欧式距离,分类规则为多数表决:
import numpy as np
from collections import Counter
class KNN:
def __init__(self, k=3):
self.k = k
self._X_train = None
self._y_train = None
def fit(self, X_train, y_train):
self._X_train = X_train
self._y_train = y_train
# 通过训练数据预测测试集
def predict(self, X):
y_pred = np.array([self.predict_single(x) for x in X])
return y_pred
# 利用已有数据对样本x进行预测
def predict_single(self, x):
# 计算 x 和训练集中所有X的距离
distances = self.get_distances(x)
print("distances=", distances)
# 对distances进行排序, 得到排序后的样本
index = self.get_sort_indexs(distances)
print("index", index)
# 选取距离最小的前k个点, 并统计每个类别(Y)出现次数
top_k_index = index[:self.k]
print("top_k_index", top_k_index)
# yt_list用来存放索引x对应的y值
yt_list = []
for item in top_k_index:
yt_list.append(self._y_train[item])
print("yt_list", yt_list)
# yt_list_counter用来对y值出现次数计数
yt_list_counter = Counter(yt_list);
print("yt_list_Counter", yt_list_counter)
# 最终返回出现次数最多的那个类别Y作为预测结果
return yt_list_counter.most_common(1)[0][0]
# 计算训练集中所有向量和给定向量间欧式距离
def get_distances(self, x):
distances = []
for xt in self._X_train:
distances.append(np.linalg.norm(xt - x))
return np.array(distances)
# 按从小到大顺序排列距离返回索引号
def get_sort_indexs(self, distances):
return np.argsort(distances)
# 训练集
X_train = np.array([[1.0, 1.1], [1.0, 1.0], [0.0, 0.0], [0.0, 0.1], [0.1, 0.1]])
y_train = np.array(['Cat', 'Cat', 'Dog', 'Dog', 'Dog'])
# 测试集
X_pred = np.array([[0.0, 0.0], [0.1, 0.1], [1.0, 1.0], [1.1, 1.1]])
clf = KNN()
# 训练
clf.fit(X_train, y_train)
# 测试
print(clf.predict(X_pred))
0x04 实验
可以看到第二章代码中我们输入的是
[0.0, 0.0], [0.1, 0.1], [1.0, 1.0], [1.1, 1.1]
四个测试样本。
运行程序结果如下:
['Dog' 'Dog' 'Cat' 'Cat']
结果符合预期,算法正确。
0x05 总结
KNN确实思想很简单,是一个很容易理解的有监督学习算法。
KNN最重要的3点是K值、距离度量(欧氏距离、曼哈顿距离)、分类规则(多数表决、加权表决)。
但要注意和KMeans相区别。