KNN算法花的分类预测

KNN算法花的分类预测


#导入库
import csv #读取文件
import random #返回随机生成的一个实数,它在[0,1)范围内。
import math
import operator


#load数据集dateset,将以csv方式打开的文件通过csv.reader()读取所有行数据,
# 再通过list将每组数据变为列表的形式,将数组里的数字变成float形式,
# 最后通过rando.random()及split将数据分为训练trainingSet和测试testSet两部分。
def loadDataset(filename,split,trainingSet=[],testSet=[]):
    with open(filename,'rt') as csvfile:
        lines = csv.reader(csvfile)#读取所有行
        dataset = list(lines)#转化成list结构
        print('dataset:'+str(dataset))
        print('len(dataset):'+str(len(dataset)))
        for x in range(len(dataset)): #总共dataset的长度
            for y in range(4):
                dataset[x][y] = float(dataset[x][y])
            if random.random() < split:
                trainingSet.append(dataset[x])#一定记得加[x]
            else:
                testSet.append(dataset[x])

#计算一组参数的距离。

def euclideanDistance(instance1,instance2,lenth):
    distance = 0
    for x in range(lenth):
        distance += pow((instance1[x]-instance2[x]),2)
    return math.sqrt(distance)

#计算一个测试数据与所有训练集数据的距离,并通过.sort(key=operator.itemgetter(1)将距离从小到大排序。
# 通过k个循环,返回最近的K个邻居数据每个邻居仍为一个list。
def getNeighbors(trainingSet,testInstance,k):
    distances = []
    lenth = len(testInstance)-1#测试数据的维度
    for x in range(len(trainingSet)):#计算测试的数据与每个训练数据的距离
        dist = euclideanDistance(testInstance,trainingSet[x],lenth)
        distances.append((trainingSet[x],dist))#把每个距离都追加到distances当中###要多加一个括号做成一组传入参数
    distances.sort(key=operator.itemgetter(1))
    neighbors = []
    for x in range(k):
        neighbors.append(distances[x][0])
    return neighbors

#根据最近的邻居,根据少数服从多数的原则,将其归类(以距离排序,看那个站大多数)
#通过sorted(classVotes.items(),key = operator.itemgetter(1),reverse=True)
#将邻居从数量多的向数量少的进行排序,最后返回排名第一的标签名。
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
    # print(str(classVotes))
    sortedVotes = sorted(classVotes.items(),key = operator.itemgetter(1),reverse=True)
    return sortedVotes[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

#主函数定义
def main():
    trainingSet = []
    testSet = []
    split = 0.67
    loadDataset(r'E:\Python\practice\KNN\irisdata.txt', split, trainingSet, testSet)
    print('train set:' + repr(len(trainingSet)))
    print('test set:' + repr(len(testSet)))

    predictions = []
    k = 3
    for x in range(len(testSet)):#循环并测试所有测试集,输出测试结果与真实标签。
        neighbors = getNeighbors(trainingSet,testSet[x],k)
        result = getResponse(neighbors)
        predictions.append(result)
        print('>predicted='+repr(result),'actual='+repr(testSet[x][-1]))

    accuracy = getAccuracy(testSet,predictions)
    print ('Accuracy:'+repr(accuracy)+'%')


if __name__ == '__main__':
    main()

你可能感兴趣的:(KNN算法花的分类预测)