本博客只记录实现李航老师《统计学习方法》中讨论的算法,具体的算法流程和推导,请看书中相关章节
这篇博客用最简单的方法实现了K近邻模型。
之后会利用KD树实现K-近邻算法。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author='icesun'
import numpy as np
from collections import Counter
#距离量度,根据p的不同,生成不同的距离零度
#p=1,曼哈顿距离
#p=2, 欧氏距离
#p为无穷大是,是各个坐标距离的最大值
def distance(p, x1, x2):
dis = np.float_power(np.sum(np.float_power(x1 - x2, p)), 1 / p)
return dis
def KNN_classfier(test_datasets, test_labels, train_dataset, train_labels, k, distance):
# 记录每一个测试样例的预测结果
prdict = []
for test_vec in test_datasets:
# 记录最近k个的距离以及label
knn_dist_list = []
knn_label_list = []
for i in range(len(train_dataset)):
label = train_labels[i]
train_vec = train_dataset[i]
dist = distance(train_vec, test_vec)
# 前k个训练数据,直接填充到knn列表中
if i < k:
knn_dist_list.append(dist)
knn_label_list.append(label)
# 后面每一个数据,都要计算与测试数据之间的距离,
#若果距离小于knn列表中距离的最大值,则替换
else:
# 距离最大值
max_dis = max(knn_dist_list)
if dist < max_dis:
#替换数据
max_index = knn_dist_list.index(max_dis)
knn_dist_list[max_index] = dist
knn_label_list[max_index] = label
# 对标签进行统计,出现最多的是测试样例对应的label
label_counts = Counter(knn_label_list)
prdict.append(label_counts.most_common(1))
# 计算预测准确率
acc = np.sum(test_labels == np.array(prdict)) / len(prdict)
return prdict, acc
#if __name__ == '__main__':
# a = np.array([1,1,1,1,0])
# b = np.array([1,1,1,1,1])
# print(np.sum(a == b))