python语言,vscode工具。
一、k临近算法概述
1.1 k是什么,k指的是距离目标最近的k个实例
1.2 k近邻算法
采用不测量不同特征值之间的距离方法进行分类。
k近邻算法的优缺点:
- 优点:精度高、对异常值不敏感、五数据输入假定。
- 缺点:计算复杂度高、空间复杂度高。
- 适用数据范围:数据型和标称型。
算法的计算公式
1.3
计算公式为欧式距离公式:
二、knn实现
已经对算法进行了了解并且拥有了计算公式,我们便可以找例子来开始实现。
影片名称 | 打斗镜头次数 | 亲吻镜头次数 | 电影类型 |
---|---|---|---|
少林足球 | 90 | 3 | 动作片 |
果宝特攻 | 109 | 5 | 动作片 |
变形金刚 | 98 | 2 | 动作片 |
callmebyyourname | 6 | 80 | 爱情片 |
逃学威龙 | 8 | 92 | 爱情片 |
逃学威龙2 | 4 | 78 | 爱情片 |
逃学威龙3 | 78 | 7 | 动作片 |
from matplotlib import pyplot as plt
from numpy import *
import operator
def createDataSet():
group = array([[90, 3], [109, 5], [98, 2], [6, 80], [8, 92], [4, 78],[78,7]])
labels = ['动作片', '动作片', '动作片', '爱情片', '爱情片', '爱情片','动作片']
return group, labels
def classifyKNN(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
def data_show(in_data, train_data):
x = []
y = []
for i in range(train_data.shape[0]):
x.append(train_data[i][0])
y.append(train_data[i][1])
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.plot(x, y, "*")
plt.xlabel("打斗镜头出现次数")
plt.ylabel("接吻镜头出现次数")
plt.plot(in_data[0], in_data[1], "r*")
plt.show()
if __name__ == '__main__':
group, labels = createDataSet()
# 测试集
test = [97, 4]
# kNN分类
test_class = classifyKNN(test, group, labels, 3)
# 打印分类结果
print('该电影类型为' + test_class)
data_show(test, group)
实现了运行
总结
knn算法可以处理分类问题并且算法简单易懂而且可以免去训练过程,但效率低,每一次分类都要对训练数据进行计算,有时准确性也不高