KNN应用及算法简单实现

 KNN应用及算法简单实现

鸢尾[yuān wěi](学名:Iris tectorum Maxim. iris数据集,统计学常用数据集

from sklearn import neighbors

from sklearn import datasets

knn = neighbors.KNeighborsClassifier()

iris = datasets.load_iris()

print(iris)

knn.fit(iris.data, iris.target)

predictedLabel = knn.predict([[0.1,0.2,0.3,0.4]])

print(predictedLabel)

自己编程实现KNN算法(根据网上代码修改,已添加权重,即便这样,还是有90%的情况,算法确实不怎么好)

--key,需要说明的是,数据点有可能是重复的,即dist0,这样就不能作为权重了,但同时也可以break(找到完全匹配)

import csv

import math

import random

import operator

def loadDataset(filename, split, trainingSet=[], testSet=[]):

    with open(filename, 'r'as csvfile:

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

    distance = 0

    for x in range(length):

        distance += pow((instance1[x] - instance2[x]), 2)

    return math.sqrt(distance)

def getNeighbors(trainingSet, testInstance, k):

    distances = []

    length = len(testInstance) - 1

    for x in range(len(trainingSet)):

        dist = euclideanDistance(testInstance, trainingSet[x], length)

        distances.append((trainingSet[x], dist))

    distances.sort(key=operator.itemgetter(1))

    neighbors = []

    for x in range(k):

        neighbors.append(distances[x])

        return neighbors

def getResponse(neighbors):

    classVotes = {}

    for x in range(len(neighbors)):

        species = neighbors[x][0][-1]

        dist = neighbors[x][1]

        if dist == 0:

            return species

        if species in classVotes:

            classVotes[species] += 1 / dist

        else:

            classVotes[species] = 1 / dist

    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.0

 

 

def main():

    trainingSet = []

    testSet = []

    split = 0.67  # 2/3训练集,1/3测试集

    loadDataset(r'D:\OneDrive\data\[Python]\iris.txt', split, trainingSet, testSet)

    print('Train set: ' + repr(len(trainingSet)))

    print('Test set: ' + repr(len(testSet)))

    predictions = []

    k = 7

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

    print ('predictions: ' + repr(predictions))

    accuracy = getAccuracy(testSet, predictions)

    print('Accuracy: ' + repr(accuracy) + '%')

 

 

if __name__ == '__main__':

    main()

iris数据sample(这是从R中取的,去掉第一列,空格从长到短批量替换为英文逗号):5.1,3.5,1.4,0.2,setosa

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值