基本原理是找到k个与测试点最近的点,这些点中出现次数最多的类别就是该测试点所属的类别

代码如下:

import numpy as np
import operator

# 已知分类数据
x_data = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[81,2]])
y_data = np.array(['A','A','A','B','B','B'])
# 测试数据
x_test = np.array([18,90])
# 计算样本数量
x_data_size = x_data.shape[0]

# 生成和样本行数一样多的测试样本
# np.tile(x_test,(x_data_size,1))

KNN算法的原理

# 根据欧式距离公式计算距离
diffmat = np.tile(x_test,(x_data_size,1)) - x_data
distances = ((diffmat**2).sum(axis = 1))**0.5

KNN算法的原理

# 对求得的距离列表 按数值大小 对distances中的数据进行下标排序
sortedDis = distances.argsort()
# 对这k个距离 进行判断所属分类  并将每个分类中的类名与个数按 键—值 存放在字典中
classCount = {}
k = 5 #设置k值
for i in range(k):
    votelabel = y_data[sortedDis[i]]  #获取标签
    classCount[votelabel] = classCount.get(votelabel,0) + 1
# 根据operator.itemgetter(1)  第一个值对classcount排序,然后在取倒叙
sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True)
# 获取最多数量的标签
knnclass = sortedClassCount[0][0]
print(knnclass)

KNN算法的原理

以上就是knn算法的原理,下面是对tile函数的理解

tile函数:

>>> import numpy
>>> numpy.tile([0,0],5)#在列方向上重复[0,0]5次,默认行1次
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> numpy.tile([0,0],(1,1))#在列方向上重复[0,0]1次,行1次
array([[0, 0]])
>>> numpy.tile([0,0],(2,1))#在列方向上重复[0,0]1次,行2次
array([[0, 0],
       [0, 0]])
>>> numpy.tile([0,0],(3,1))
array([[0, 0],
       [0, 0],
       [0, 0]])
>>> numpy.tile([0,0],(1,3))#在列方向上重复[0,0]3次,行1次
array([[0, 0, 0, 0, 0, 0]])
>>> numpy.tile([0,0],(2,3))<span style="font-family: Arial, Helvetica, sans-serif;">#在列方向上重复[0,0]3次,行2次</span>
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]])

下面是对knn算法的使用

import numpy as np
from sklearn.neighbors import KNeighborsClassifier

# 数据
X_train = np.array([[180,75,43],[170,50,38],[165,48,37],[172,65,42],[175,68,42],[162,52,37]])
# 目标值
y_train = np.array(['男','女','女','男','男','女'])
knn = KNeighborsClassifier(n_neighbors=3)
# 机器学习的训练
knn.fit(X_train,y_train)

# 使用算法,对新的数据,进行预测
X_test = np.array([[183.2,67,44],[167.5,51,38]])
knn.predict(X_test)

KNN算法的原理

相关文章: