构造KNN分类器
- 获取新的样本数据
- 获取样本库的数
- 选择K值
- 计算样本数据与样本库之间的距离
- 根据距离进行排序
- 针对K个点,统计各个类别的数量
- 投票机制,少数服从多数原则
初始化
1 2 3 4 5 6 7 8 9
| class knn_Classifier(object): """构造KNN分类器"""
def __init__(self, newV, dataset, labels): self.newV = newV # 1 获取新的样本数据 self.dataset = dataset # 2 获取样本库的数 self.labels = labels # 2 获取样本库的标签 def classify(self, k):# 选择K值 pass
|
计算
- 计算样本数据与样本库之间的距离
- 根据距离进行排序
- 针对K个点,统计各个类别的数量
- 投票机制,少数服从多数原则
1 2 3 4 5 6 7 8 9 10 11
| def classify(self, k):# 选择K值 SqrtDist = EuclideanDistance3(self.newV, self.dataset) # 4 计算样本数据与样本库之间的距离 sortedDistIndexs = SqrtDist.argsort(axis=0) # 5 根据距离进行排序
classCount = {} # 6 针对K个点,统计各个类别的数量 for i in range(k): votelabel = self.labels[sortedDistIndexs[i]] classCount[votelabel] = classCount.get(votelabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) # 7 投票机制,少数服从多数原则 return sortedClassCount[0][0]
|
构造单个分类器
1 2 3 4 5 6 7
| ice = 5 water = 10 time = 1 newV = [ice, water, time] k = knn_Classifier(newV, dataset, labels) res = k.classify(len(dataset)) print("某人吃了{}个冰淇淋,喝了{}升水,在户外活动了{}小时,因为他觉得今天{}。".format(newV[0],newV[1],newV[2],res))
|
数据集:[[8 4 2][7 1 1] [1 4 4] [3 0 5]
标签:[‘非常热’, ‘非常热’, ‘一般热’, ‘一般热’]
某人吃了5个冰淇淋,喝了10升水,在户外活动了1小时,因为他觉得今天非常热。
批量分类预测
1 2 3 4 5 6 7 8 9
| vecs = array([[2, 1, 1], [2, 1, 5], [5, 1, 23], [5, 4, 1], [2, 3, 2]]) for vec in vecs: ice = vec[0] water = vec[1] time = vec[2] newV = [ice, water, time] k = knn_Classifier(newV, dataset, labels) res = k.classify(len(dataset)) print("某人吃了{}个冰淇淋,喝了{}升水,在户外活动了{}小时,因为他觉得今天{}。".format(newV[0], newV[1], newV[2], res))
|
某人吃了2个冰淇淋,喝了1升水,在户外活动了1小时,因为他觉得今天一般热
某人吃了2个冰淇淋,喝了1升水,在户外活动了5小时,因为他觉得今天一般热。
某人吃了5个冰淇淋,喝了1升水,在户外活动了23小时,因为他觉得今天一般热。
某人吃了5个冰淇淋,喝了4升水,在户外活动了1小时,因为他觉得今天非常热。
某人吃了2个冰淇淋,喝了3升水,在户外活动了2小时,因为他觉得今天一般热。