knn算法

1.什么是knn算法?

    

邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。(来自百度百科)

下面通过一个简单的例子说明一下:如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

 

由此也说明了KNN算法的结果很大程度取决于K的选择。
2、遇到的问题
  1、random

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个随机且独立的元素;

  2、sort 与 sorted:关注博客:

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()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值