KNN 函数调用 笔记

    技术2022-07-13  77

    分类

    计算出和所有实例间的距离 选最近的K个 k一般选奇数,大多数投票比较方便

    距离: 欧拉距离:两点距离 根号[(x1-x2)^2+(y1-y2)^2+(z1-z2)^2......] 其他距离衡量:余弦值cos,相关度,曼哈顿距离

    对k的选择非常敏感

    空间,时间复杂度都很高 当样本分布不均匀,比如其中一类数量过多,就比较容易预测到这一类

    改进版本 考虑距离,根据距离加上权重 比如: 1/d (d:距离)

    应用

    数据集:虹膜 150个实例 萼片长度、宽度,花瓣长度、宽度 类别:3类

    from sklearn import neighbors #KNN from sklearn import datasets #数据集在这里 knn = neighbors.KneighborsClassifier() iris = datasets.load_iris() #导入数据库 print iris #模型建立 knn.fit(iris.data,iris.target)#第一个参数是 X #第二个参数是 Y pre = knn.predict([[0.1,0.2,0.3,0.4]]) print pre

    自己实现

    import csv import random import math import operator # 文件路径和名称 分成训练集和验证集 训练集 测试集 把原始数据分开 def loadDataset(filename,split,train=[],test=[]) #装载数据集 with open(filename,'rb') as csvfile: lines = csv.reader(csvfile) #读行 dataset = list(lines) #转成list for x in range(len(dataset)-1): #遍历 for y in range(4): dataset[x][y]=float(dataset[x][y]) #4个属性 if random.random()<split: #分成验证集和训练集 train.append(dataset[x]) else: test.append(dataset[x]) def Distance(ins1,ins2,lenghth): #第三个参数是维度 dis = 0 for x in range(lenghth): dis+=pow((ins1[x]-ins2[x]),2) return math.sqrt(dis) def getNb(trainset,testInstance,k):#返回最近K个邻居 dis=[] #所有距离 leng = len(testInstance)-1 #测试的实例的维度减一 for x in range(len(train)): #训练集的每一个实例到测试实例的距离 dist = Distance(tesInstance,trainset[x],leng) dis.append((trainset[x],dist)) dis.sort(key=operator.itemgetter(1)) #从小到大 nb = [] for x in range(k): nb.append(dis[x][0]) #最近的K个邻居实例 return nb def getResponse(neighbor): #大多数投票 classV={} for x in range(len(neighbor)): response = neighbor[x][-1] if response in classV: #计数 classV[response] +=1 else: classV[response] = 1 sortV = sorted(classV.iteritems(),k=operator.itemgetter(1),reverse=True)#从大到小排序 return sortV[0][0] def Accuracy(testSet,pre): #验证集的正确度 corr = 0 for x in range(len(testSet)): if( testSet[x][-1] == pre[x]: corr += 1 return (corr/float(len(testSet)))*100.0 def main(): train = [] test = [] split=0.67 # 1/3为验证集 loadDataset(r'D:\set.txt',split,train,test) # r : 忽略特殊符号 print 'Train:' + repr(len(train)) print 'Test:' + repr(len(test)) pre=[] k=3 for x in range(len(test)): nb = getNb(train,test[x],k) res = getResponse(nb) pre.append(res) acc = Accuracy(test,pre) print acc main()
    Processed: 0.016, SQL: 9