1.什么是knn算法?
下面通过一个简单的例子说明一下:如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。
由此也说明了KNN算法的结果很大程度取决于K的选择。
random.random()函数是这个模块中最常用的方法了,它会生成一个随机的浮点数,范围是在0.0~1.0之间。
random.uniform()正好弥补了上面函数的不足,它可以设定浮点数的范围,一个是上限,一个是下限。
random.randint()随机生一个整数int类型,可以指定这个整数的范围,同样有上限和下限值,python random.randint。
random.choice()可以从任何序列,比如list列表中,选取一个随机的元素返回,可以用于字符串、列表、元组等。
random.shuffle()如果你想将一个序列中的元素,随机打乱的话可以用这个函数方法。
random.sample()可以从指定的序列中,随机的截取指定长度的片断,不作原地修改。
1 )、random() 返回0<=n<1之间的随机实数n;
2 )、choice(seq) 从序列seq中返回随机的元素;
3 )、getrandbits(n) 以长整型形式返回n个随机位;
4 )、shuffle(seq[, random]) 原地指定seq序列;
5 )、sample(seq, n) 从序列seq中选择n个随机且独立的元素;
python 列表排序方法sort、sorted技巧篇
import csv
import random
import math
import operator
#载入文件
def loadDataset(filename, split, traningSet=[], testSet=[]):
with open(filename, 'rb') as file:
lines = csv.reader(file)
dataSet = list(lines)
for x in range(len(dataSet)):
for y in range(4):
dataSet[x][y] = float(dataSet[x][y])
if random.random() < split:
traningSet.append(dataSet[x])
else:
testSet.append(dataSet[x])
#求解两点之间的距离(length维)
def eulideanDistance(instance1, instance2, length):
distance = 0
for x in range(length):
distance = pow((instance1[x] - instance2[x]), 2)
return math.sqrt(distance)
#得到与testinstance最近的k个点
def getNeighbors(traningSet, testinstance, k):
distance = []
length = len(testinstance) - 1
for x in range(len(traningSet)):
dis=eulideanDistance(traningSet[x], testinstance, length)
distance.append((traningSet[x], dis))
#print distance
distance.sort(key = operator.itemgetter(1))
neighbor=[]
for x in range(k):
neighbor.append(distance[x][0])
return neighbor
#将最近的k个点转化为名称
def getResponce(neighbor):
classVote={}
for x in range(len(neighbor)):
res = neighbor[x][-1]
if res in classVote:
classVote[res] += 1
else:
classVote[res] = 1
vote=sorted(classVote.iteritems(), key=operator.itemgetter(1), reverse=True)
return vote[0][0]
#测试精度
def getAccuacy(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():
traningSet=[]
testSet=[]
split=0.67
loadDataset(r'C:\Users\QAQ\Desktop\knndata.txt', split, traningSet, testSet)
print 'Train set: ' + repr(len(traningSet))
print 'Test set: ' + repr(len(testSet))
k = 3
predictions=[]
# ne = getNeighbors(traningSet, [5.1, 3.7, 1.5, 0.4, 1], k)
# print getResponce(ne)
for x in range(len(testSet)):
ne = getNeighbors(traningSet, testSet[x], k)
res = getResponce(ne)
predictions.append(res)
accuracy = getAccuacy(testSet, predictions)
print('Accuracy: ' + repr(accuracy) + '%')
main()