1. 什么是最近邻规则KNN分类算法?
2.KNN算法代码实现步骤?
3.算法优点
4.算法缺点
5.算法改进
1. 什么是最近邻规则KNN分类算法
计算未知标签样本点与所有训练集中已知标签的样本点的距离。选择出k个距离最近的样本点,根据标签类别个数“少数服从多数”的原则,让未知标签样本点归类为k个最近邻训练集样本点中个数最多的类别。
2.KNN算法代码实现步骤
1.打开文件,读取数据并赋值。导入数据后随机划分训练集和测试集。
loaddataset(filename,split,trainingset=[],testset=[])
2.计算两点之间欧氏距离
euclideandistance(instance1,instance2,length)
3.返回最近的k个邻居
getneighbors(trainingset,testsample,k)
4.根据“少数服从多数”原则返回未知样本点所属类别
getresponse(neighbors)
5.计算算法精确度
getaccuracy(testset,predictions)
6.预测
7.主函数
代码实现
本次代码的环境:
运行平台: Windows
Python版本: Python3.x
IDE: PyCharm
# coding:utf-8
import csv
import random
import math
import operator
def loaddataset(filename,split,trainingset=[],testset=[]):
with open(filename,'rt') as csvfile:
lines=csv.reader(csvfile)
dataset=list(lines)
print("totaldataset:"+repr(len(dataset)))
for x in range(len(dataset)):
for y in range(4):
dataset[x][y]=float(dataset[x][y])
if random.random()<split:
trainingset.append(dataset[x])
else:
testset.append(dataset[x])
def euclideandistance(instance1,instance2,length):
distance=0
for i in range(length):
distance+=pow((instance1[i]-instance2[i]),2)
return(math.sqrt(distance))
def getneighbors(trainingset,testsample,k):
distances=[]
for x in range(len(trainingset)):
distance=euclideandistance(trainingset[x],testsample,len(testsample)-1)
distances.append((trainingset[x],distance))
distances.sort(key=operator.itemgetter(1))
neighbors=[]
for x in range(k):
neighbors.append(distances[x][0])
return(neighbors)
def getresponse(neighbors):
classvotes={}
for i in range(len(neighbors)):
response=neighbors[i][-1]
if response in classvotes:
classvotes[ response]+=1
else:
classvotes[ response]=1
sortedvotes=sorted(classvotes.items(),key=lambda item:item[1],reverse=True)
return(sortedvotes[0][0])
def getaccuracy(testset,predictions):
correct=0
for x in range(len(testset)):
if testset[x][-1]==predictions[x]:
correct+=1
return(correct/float(len(testset))*100)
def main():
split=0.618
trainingset=[]
testset=[]
loaddataset(r'C:\Users\66\Desktop\一深度学习\代码与素材\02KNN\irisdata.txt',split,trainingset,testset)
print("trainingset:"+repr(len(trainingset)))
print("testset:"+repr(len(testset)))
k=9
predictions=[]
for x in range(len(testset)):
neighbors=getneighbors(trainingset,testset[x],k)
result=getresponse(neighbors)
predictions.append(result)
print(">predict:"+repr(result)+",actual:"+repr(testset[x][-1]))
accuracy=getaccuracy(testset,predictions)
print("accuracy:{:.3f}".format(accuracy)+"%")
print("*"*50)
predictset=[[1,2,3,4],[4,5,6,8],[9,10,11,12]]
for x in range(len(predictset)):
for y in range(len(predictset[0])):
predictset[x][y]=float(predictset[x][y])
k=9
for x in range(len(predictset)):
neighbors=getneighbors(trainingset, predictset[x],k)
result=getresponse(neighbors)
print(repr(predictset[x])+"predict:"+repr(result))
main()
3.算法优点
简单
易于理解
容易实现
通过对k的选择可具备丢弃噪音数据的健壮性
4.算法缺点
需要大量空间存储已知实例
算法复杂度高,需要计算所有已知类别实例与要分类实例的距离
样本分布不均衡时,若其中一类样本实例过多,易影响分类。如下图所示:
5.算法改进
考虑距离,根据距离加上权重。
eg:(1/d)d:指距离。