1.直接上代码
import numpy as np
#import operator
import math
def createDataSet():
group = np.array([[1.0, 2.0], [1.2,0.1], [0.1,1.4], [0.3,3.5]])
labels = ['A', 'A', 'B', 'B']
return group, labels
def classify(testData, trainData, trainlabel, k):
dataSize = trainData.shape[0]
#calu distacne
#tile, repeat data
diff = np.tile(testData, (dataSize, 1)) - trainData
sdiff = diff ** 2
#get sum result per row
sumSdiff = np.sum(sdiff, axis = 1)
dist = sumSdiff ** 0.5
# sort,return index,up
sortedIndexUp = np.argsort(dist)
#use dictory,key = label, value = nums
labelDict = {}
for i in range(k):
tL = trainlabel[sortedIndexUp[i]]
labelDict[tL] = labelDict.get(tL, 0) + 1
defaultValue = 0
for k, v in labelDict.items():
if v > defaultValue:
defaultValue = v
classes = k
return classes
if __name__ == "__main__":
group, lables = createDataSet()
testData = [1.1, 0.3]
k = 3
cla = classify(testData, group, lables, k)
print("predict calssify=", cla)
2. 算法介绍
KNN算法,即为K最近邻。通俗的讲,有两个村庄,分别是八里湾和柳树沟,突然有一天,从天上掉下来了一个家伙。他要在这里生活,首先要确定自己是哪个村庄的。那么如何确定呢?八里湾最帅的小哥出了个主意,那就是找到K个与自己最近的邻居,这K个邻居中那个村庄的最多,那他就是哪个村子的。
那么问题来了,要确定与邻居的距离,首先要确定自己的位置以及邻居的位置,其次来求距离。位置可通过坐标确定,那坐标即是机器学习中的特征,也就是从数据中提取出的有用信息。
求距离一般采用欧氏距离,即求两点间距离公式。
已确定的属于哪个村庄的居民是训练集,天上掉下的是测试集。
3. 算法流程及重点函数说明
3.1 算法流程
1)计算测试数据与各个训练数据之间的距离
2)按照升序排列距离数据
3)取出前K个距离数据,查看这K个距离数据对应的类别
4)返回最多的那个类别,即完成了分类
3.2 函数说明
numpy.tile(A,reps)
重复数据A,reps的数据格式是(row, col),即重复行多少次,列多少次。
如不reps的数据是单个数字,则代表行重复一次,列重复单个数字次。
举例说明如下:
in] a
out] array([1, 2])
in] np.tile(a, 2)
out] array([1, 2, 1, 2])
in] np.tile(a, (1,2))
out] array([[1, 2, 1, 2]])
numpy.argsort(A, axis=)
排序函数,返回值是其数据的index。默认升序。
当为二维数组时,axis=0,代表按照列进行排序。axis= 1, 代表按照行排序。
例子如下:
temp
array([[1, 2],
[4, 3]])
np.argsort(temp, )
array([[0, 1],
[1, 0]], dtype=int64)
np.argsort(temp, axis=0)
array([[0, 0],
[1, 1]], dtype=int64)
np.argsort(temp, axis=1)
array([[0, 1],
[1, 0]], dtype=int64)
字典的get函数
dict.get(key, default)
此函数用来得到key对应的value, 如果没有key,则value为默认值。如有Key,则返回其真实value值。
例子如下:
dict = {'a':4, 'b':1}
dict
{'a': 4, 'b': 1}
dict.get('a')
4
dict.get('b')
1
dict.get('b', 0)
1
dict.get('b', 0)+1
2
dict
{'a': 4, 'b': 1}
4. 代码说明
createDataSet()函数用来生成训练集。其中labels对应着其训练集的标签,也就是分类。
classify(testData, trainData, trainlabel, k)函数用来对测试数据进行分类预测。
具体代码介绍参考算法流程。