深度学习*学习笔记---之最邻近算法KNN(2)

1、Cover和Hart在1968年提出了最初的邻近算法
2、KNN 算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。
3、类别决策时,只与极少量的相邻样本有关。
4、距离的测量方法:
Euclidean Distance欧式距离
cos距离
相关度
manhattan distance曼哈顿距离
5、缺陷:
需要大量空间存储所有已知实例
算法复杂度高
样本分布不均时,比如其中一类样本过大(实例数量过多)占主导样本,因为这类样本实例的数量过大,但这个新的未知实例实际并不接近目标样本。
6、改进:
考虑距离,根据距离加上权重
比如:1/d(d:距离)
7、应用
(数据集)虹膜:150个实例,萼片长度(sepal length)、萼片宽度(sepal width)、花瓣长度(petal length)、花瓣宽度(petal width)

利用Python 的机器学习库sklearn:SKLearnExample.py

import csv
import rangdom
import math
import operator

def loadataset(filename, split,trainingSet=[], testSet=[]):
with open(filename,’rb’) as csvfile #rb模式
lines = csv.reader(csvfile)#读取文件
dataset = list(lines)
for x in range(len(dataset)-1):
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)#length表示维度
distance = 0
for x in range(length):
diatance += pow((instance1[x]-instance2[x]),2)
return math.sqrt(diatance)

def getNeighbors(trainingSet, testInstance, k):#k范围内,每个测试集到训练集的距离
distances = []
length = len(testInstance) - 1
for x in range(len(trainingSet)):
dist = euclideandistance(trainingSet[x],testInstance, length )
distances.append(trainingSet[x], dist)
distance.sort(key=operator.itemgetter(1))#排序
neighbors = []
for x in range(x):
neighbors.append(distances[x][0])
return neighbors

def getRespons(neighbors):
classVotes = []
for x in range(len(neighbors)):
response = neighbors[x][-1]
if response in classVotes:
classVotes[response] += 1
else:
classVotes[response]=1
sortVotes = sorted(classVotes.iteritems(), key=operater.itemgetter(1), reverse=True)
return sortVotes[0][0]

def getAccuracy(testSet, predictions):
correct = 0
for x in range(len(testSet)):
if testSet[x][-1] == predictions[x]:
correct += 1
return (correct/(len(testSet))) * 100

def main():
trainingSet=[]
testSet=[]
split=0.67
loadDataSet(r’数据集所在目录’,split, trainingSet, testSet)
print(‘Train set:’ + repr(trainingSet))#打印训练集
print(‘Test set:’ + repr(testSet)) #打印测试集

pridictions = []
k=3
for x in range(len(testSet)):
    neighbors = getNeighbors(trainingSet, testSet[x], k)
    result = getRespons(neighbors)
    predictions.append(result)
    print('>predicted=' + repr(result) + 'actual=' + repr(testSet[x][-1]))
accuracy = getAccuracy(testSet,predictions)
print('Accuracy:' + repr(accuracy) + '%')

main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值