python实现对KNN的底层实现

版权声明:本文为博主原创文章,允许转载共享,但是请注明出处! https://blog.csdn.net/xixirupan/article/details/80960975

KNN算法很简单不做过多描述,这里直接上手写实现KNN的代码

'''
#coding:utf-8
Created on 2018年7月6日
KNN算法实现
@author: lenovo
'''
import csv
import random
import math
import operator
from unittest.test.testmock.testhelpers import TestCallList
from scipy.spatial import distance
from test.test_bisect import TestInsort
from audioop import reverse
from sklearn import neighbors
from scipy.linalg.tests.test_fblas import accuracy
'''
导入数据集
@param1 文件名称
@param2 分割方式
@param3 训练集合
@param4 测试集合
\ufeff问题解决  https://www.cnblogs.com/chongzi1990/p/8694883.html
,split,trainingsSet,testSet
'''
def loadDataset(fileName,split,trainingSet=[],testSet=[]):
    with open(fileName, "r",encoding="utf-8-sig") as csvfile:  
        lines =csv.reader(csvfile)
        allList= list(lines)
        print(len(allList))
        for x in range(len(allList)):
            for y in range(4):
                allList[x][y]=float(allList[x][y])
            if random.random()<split:
                trainingSet.append(allList[x])
            else:
                testSet.append(allList[x])
#         print(allList)
#         print(trainingSet)
#         print(testSet)
#         print(len(trainingSet))
#         print(len(testSet))
      
loadDataset("F:/AA_BigData/test_data/iris.data.txt",0.67)
'''
instance1 实例变量1
instance2 实例变量2
length  实例变量的维度
该方法是计算两个实例变量的距离
'''
def euclideanDistance(instance1,instance2,length):
    distance=0
    for x in range(length):
        distance+=pow(instance1[x]-instance2[x],2)
    return math.sqrt(distance)

'''
返回最近的 k个label
'''
def getNeighbor(trainingSet,testInstance,k):
    distance =[]
    #测试集的维度
    length=len(testInstance)-1
    #测试集合所有训练集的距离
    for x in range(len(trainingSet)):
        dist =euclideanDistance(testInstance, trainingSet[x], length)
        distance.append(dist)
    print("-",len(distance))
    #排序     用第二个元素进行排序
#     distance.sort()
    distance.sort(key=operator.itemgetter(1))
    neighbors =[]
    for x in range(k):
        neighbors.append(distance[x][0])
    return neighbors
''' 
   trainset 
'''
def getResponse(neighbors):
    classVotes ={}
    for x in range(len(neighbors)):
        response =neighbors[x][-1] 
        if response in classVotes:
            classVotes[response]+=1
        else:
            classVotes[response]+=1
    sortedVote=sorted(classVotes.iteritems(),key=operator.itemgetter(1),reverse=True) 
    return sortedVote[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.0
def main():
    trainingSet=[]
    testSet=[]
    split =0.67
    loadDataset("F:/AA_BigData/test_data/iris.data.txt", split, trainingSet, testSet)       
    predictions =[]
    k=3
    for x in range(len(testSet)):
        neighbors =getNeighbor(trainingSet, testSet[x], k)
        result =getResponse(neighbors)
        predictions.append(result)
    accuracy =getAccuracy(testSet, predictions)
    print("Accuracy:"+repr(accuracy)+"%") 
main()

其实KNN在scikit-learn中都实现了,写上面小demo纯粹为了练手python,对于python小白来说多写点废话比较合适

'''
#coding:utf-8
Created on 2018年7月6日
临近算法 KNN
@author: lenovo
'''

from sklearn import neighbors
#导入数据集模块
from sklearn import datasets 
'''
调用knn分类器
'''
knn =neighbors.KNeighborsClassifier()
'''
从python内置的dataset中导入数据集
'''
iris=datasets.load_iris();
print(iris)
'''
用KNN的分类器进行建立一个模型
fit建立这个模型 一个参数特征值 一个是类别标注
'''
knn.fit(iris.data, iris.target)
'''
模型建立之后对于新输入的实例 进行分类 标注其实哪一种花
'''
predictedLabel =knn.predict([[0.1,0.2,0.3,0.4]])
print(predictedLabel)

iris的数据集如下,自动保存想要格式即可:

5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa
4.6,3.4,1.4,0.3,Iris-setosa
5.0,3.4,1.5,0.2,Iris-setosa
4.4,2.9,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
5.4,3.7,1.5,0.2,Iris-setosa
4.8,3.4,1.6,0.2,Iris-setosa
4.8,3.0,1.4,0.1,Iris-setosa
4.3,3.0,1.1,0.1,Iris-setosa
5.8,4.0,1.2,0.2,Iris-setosa
5.7,4.4,1.5,0.4,Iris-setosa
5.4,3.9,1.3,0.4,Iris-setosa
5.1,3.5,1.4,0.3,Iris-setosa
5.7,3.8,1.7,0.3,Iris-setosa
5.1,3.8,1.5,0.3,Iris-setosa
5.4,3.4,1.7,0.2,Iris-setosa
5.1,3.7,1.5,0.4,Iris-setosa
4.6,3.6,1.0,0.2,Iris-setosa
5.1,3.3,1.7,0.5,Iris-setosa
4.8,3.4,1.9,0.2,Iris-setosa
5.0,3.0,1.6,0.2,Iris-setosa
5.0,3.4,1.6,0.4,Iris-setosa
5.2,3.5,1.5,0.2,Iris-setosa
5.2,3.4,1.4,0.2,Iris-setosa
4.7,3.2,1.6,0.2,Iris-setosa
4.8,3.1,1.6,0.2,Iris-setosa
5.4,3.4,1.5,0.4,Iris-setosa
5.2,4.1,1.5,0.1,Iris-setosa
5.5,4.2,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
5.0,3.2,1.2,0.2,Iris-setosa
5.5,3.5,1.3,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
4.4,3.0,1.3,0.2,Iris-setosa
5.1,3.4,1.5,0.2,Iris-setosa
5.0,3.5,1.3,0.3,Iris-setosa
4.5,2.3,1.3,0.3,Iris-setosa
4.4,3.2,1.3,0.2,Iris-setosa
5.0,3.5,1.6,0.6,Iris-setosa
5.1,3.8,1.9,0.4,Iris-setosa
4.8,3.0,1.4,0.3,Iris-setosa
5.1,3.8,1.6,0.2,Iris-setosa
4.6,3.2,1.4,0.2,Iris-setosa
5.3,3.7,1.5,0.2,Iris-setosa
5.0,3.3,1.4,0.2,Iris-setosa
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
6.9,3.1,4.9,1.5,Iris-versicolor
5.5,2.3,4.0,1.3,Iris-versicolor
6.5,2.8,4.6,1.5,Iris-versicolor
5.7,2.8,4.5,1.3,Iris-versicolor
6.3,3.3,4.7,1.6,Iris-versicolor
4.9,2.4,3.3,1.0,Iris-versicolor
6.6,2.9,4.6,1.3,Iris-versicolor
5.2,2.7,3.9,1.4,Iris-versicolor
5.0,2.0,3.5,1.0,Iris-versicolor
5.9,3.0,4.2,1.5,Iris-versicolor
6.0,2.2,4.0,1.0,Iris-versicolor
6.1,2.9,4.7,1.4,Iris-versicolor
5.6,2.9,3.6,1.3,Iris-versicolor
6.7,3.1,4.4,1.4,Iris-versicolor
5.6,3.0,4.5,1.5,Iris-versicolor
5.8,2.7,4.1,1.0,Iris-versicolor
6.2,2.2,4.5,1.5,Iris-versicolor
5.6,2.5,3.9,1.1,Iris-versicolor
5.9,3.2,4.8,1.8,Iris-versicolor
6.1,2.8,4.0,1.3,Iris-versicolor
6.3,2.5,4.9,1.5,Iris-versicolor
6.1,2.8,4.7,1.2,Iris-versicolor
6.4,2.9,4.3,1.3,Iris-versicolor
6.6,3.0,4.4,1.4,Iris-versicolor
6.8,2.8,4.8,1.4,Iris-versicolor
6.7,3.0,5.0,1.7,Iris-versicolor
6.0,2.9,4.5,1.5,Iris-versicolor
5.7,2.6,3.5,1.0,Iris-versicolor
5.5,2.4,3.8,1.1,Iris-versicolor
5.5,2.4,3.7,1.0,Iris-versicolor
5.8,2.7,3.9,1.2,Iris-versicolor
6.0,2.7,5.1,1.6,Iris-versicolor
5.4,3.0,4.5,1.5,Iris-versicolor
6.0,3.4,4.5,1.6,Iris-versicolor
6.7,3.1,4.7,1.5,Iris-versicolor
6.3,2.3,4.4,1.3,Iris-versicolor
5.6,3.0,4.1,1.3,Iris-versicolor
5.5,2.5,4.0,1.3,Iris-versicolor
5.5,2.6,4.4,1.2,Iris-versicolor
6.1,3.0,4.6,1.4,Iris-versicolor
5.8,2.6,4.0,1.2,Iris-versicolor
5.0,2.3,3.3,1.0,Iris-versicolor
5.6,2.7,4.2,1.3,Iris-versicolor
5.7,3.0,4.2,1.2,Iris-versicolor
5.7,2.9,4.2,1.3,Iris-versicolor
6.2,2.9,4.3,1.3,Iris-versicolor
5.1,2.5,3.0,1.1,Iris-versicolor
5.7,2.8,4.1,1.3,Iris-versicolor
6.3,3.3,6.0,2.5,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
7.1,3.0,5.9,2.1,Iris-virginica
6.3,2.9,5.6,1.8,Iris-virginica
6.5,3.0,5.8,2.2,Iris-virginica
7.6,3.0,6.6,2.1,Iris-virginica
4.9,2.5,4.5,1.7,Iris-virginica
7.3,2.9,6.3,1.8,Iris-virginica
6.7,2.5,5.8,1.8,Iris-virginica
7.2,3.6,6.1,2.5,Iris-virginica
6.5,3.2,5.1,2.0,Iris-virginica
6.4,2.7,5.3,1.9,Iris-virginica
6.8,3.0,5.5,2.1,Iris-virginica
5.7,2.5,5.0,2.0,Iris-virginica
5.8,2.8,5.1,2.4,Iris-virginica
6.4,3.2,5.3,2.3,Iris-virginica
6.5,3.0,5.5,1.8,Iris-virginica
7.7,3.8,6.7,2.2,Iris-virginica
7.7,2.6,6.9,2.3,Iris-virginica
6.0,2.2,5.0,1.5,Iris-virginica
6.9,3.2,5.7,2.3,Iris-virginica
5.6,2.8,4.9,2.0,Iris-virginica
7.7,2.8,6.7,2.0,Iris-virginica
6.3,2.7,4.9,1.8,Iris-virginica
6.7,3.3,5.7,2.1,Iris-virginica
7.2,3.2,6.0,1.8,Iris-virginica
6.2,2.8,4.8,1.8,Iris-virginica
6.1,3.0,4.9,1.8,Iris-virginica
6.4,2.8,5.6,2.1,Iris-virginica
7.2,3.0,5.8,1.6,Iris-virginica
7.4,2.8,6.1,1.9,Iris-virginica
7.9,3.8,6.4,2.0,Iris-virginica
6.4,2.8,5.6,2.2,Iris-virginica
6.3,2.8,5.1,1.5,Iris-virginica
6.1,2.6,5.6,1.4,Iris-virginica
7.7,3.0,6.1,2.3,Iris-virginica
6.3,3.4,5.6,2.4,Iris-virginica
6.4,3.1,5.5,1.8,Iris-virginica
6.0,3.0,4.8,1.8,Iris-virginica
6.9,3.1,5.4,2.1,Iris-virginica
6.7,3.1,5.6,2.4,Iris-virginica
6.9,3.1,5.1,2.3,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
6.8,3.2,5.9,2.3,Iris-virginica
6.7,3.3,5.7,2.5,Iris-virginica
6.7,3.0,5.2,2.3,Iris-virginica
6.3,2.5,5.0,1.9,Iris-virginica
6.5,3.0,5.2,2.0,Iris-virginica
6.2,3.4,5.4,2.3,Iris-virginica
5.9,3.0,5.1,1.8,Iris-virginica

 
 

猜你喜欢

转载自blog.csdn.net/xixirupan/article/details/80960975