k-近邻实现《机器学习实战》

    knn算法的实现原理是将测试数据集与样本数据集中数据对应的特征进行比较,提取k个特征最相似数据的分类标签。
1.先做一个简单的数据

1
2
3
4
5
6
7
8
9
10
from numpy import *
#简单数据
def dataset():
'''
定义一个简单数据集
:return: train 数据集,labels 对应的标签
'''
train = array([[1, 0.1], [0, 0.1], [1, 1], [0, 0]])
labels = ['A', 'B', 'A', 'B']
return train, labels

2.实现knn算法
计算两个向量点xA和xB之间的距离需要使用到欧式距离公式

$d(x,y)=\sqrt{(x_1-y_1)^{2}+(x_2-y_2)^{2}+(x_n-y_n)^{2}}=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^{2}}$

例如,点(0,0)与(1,2)之间的距离计算为:

$\sqrt{(1-0)^{2}+(2-0)^{2}}$

如果数据集存在4个特征值, 则点(1,0,0,1)与(7,6,9,4)之间的距离计算为:

$\sqrt{(7-1)^{2}+(6-0)^{2}+(9-0)^{2}+(4-1)^{2}}$

计算完距离以后对数据进行从小到的排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def Knn(inputdate, train, lablel , k):
'''
首先是要做欧式距离运算的,所以首先
1.是把输入的指矩阵进行复制可与测试的模型进行运算
2.排序以后取前k个相近的值进行分类
3.返回那个分类
:param inputdate: 测试数据
:param train: 样本数据
:param lablel: 样本数据标签
:param k: k值
:return: 最近标签
'''
#对输入数据做处理,跟样本数据一样的维度大小
inputdata = tile(inputdate,(train.shape[0],1))
#对数据集做欧式距离运算
vla = (inputdata - train)**2
vlaue = (vla.sum(axis=1))**0.05
#返回从小到大的索引
sortval = vlaue.argsort()
dict = {}
#取前k个值
for i in range(k):
#保存成对应的键值对
dict[vlaue[sortval[i]]]=lablel[sortval[i]]
sortcalsscount = sorted(dict.items(), key=lambda item: item[0])
print("排序以后的%",sortcalsscount)
return sortcalsscount[0][1]

如果想用现有的数据集,对数据集进行特征抽取,下一篇有做介绍

版权声明:本文为博主原创,如若转载请标明出处https://dword.top/k-近邻.html

-------------end-------------
0%