KNN实践判断iris花的品种

来源:互联网 发布:dcs组态算法转换 编辑:程序博客网 时间:2024/06/02 23:43

k邻近(KNN)算法应该是机器学习算法中最简单的一个吧。

kNN(k Nearest Neighbors)算法又叫k最临近方法, 总体来说kNN算法是相对比较容易理解的算法之一,假设每一个类包含多个样本数据,而且每个数据都有一个唯一的类标记表示这些样本是属于哪一个分类, kNN就是计算每个样本数据到待分类数据的距离,取和待分类数据最近的k各样本数据,那么这个k个样本数据中哪个类别的样本数据占多数,则待分类数据就属于该类别。

不过KNN的不足也很明显,计算量大,每一个判断输入都要扫一遍数据集,而且没有训练过程。

在UCI

http://archive.ics.uci.edu/ml/datasets/Iris

找到了一些数据集,数据算是非常简单了

from numpy import *import osfrom collections import Counterdef dataPre(filePath):    fr = open(filePath)    fileNumber = len(fr.readlines())    fr = open(filePath)    simpleLine = fr.readline()    simpleLine = simpleLine.strip()    colNumber = len(simpleLine.split(',')) - 1    retMat = zeros((fileNumber, colNumber))    classLabel = []    index = 0    fr = open(filePath)    for line in fr.readlines():        line = line.strip()        cols = line.split(',')        retMat[index,:] = cols[0 : colNumber]        classLabel.append(cols[colNumber])        index += 1    return Norm(retMat), classLabeldef Norm(dataSet):    minVals = dataSet.min(0)    maxVals = dataSet.max(0)    ranges = maxVals = minVals    normDataSet = zeros(shape(dataSet))    m = len(dataSet)    normDataSet = dataSet - tile(minVals, (m, 1))    normDataSet = normDataSet / tile(ranges, (m, 1))    return normDataSetdef classify(dataSet, dataSetLabel, input, k):    iCols = input    print len(dataSet[0])    if len(dataSet[0]) != len(iCols):        print 'Input Error'        return    diffMat = tile(iCols, (len(dataSet),1)) - dataSet    sqDistancesMat = (diffMat**2).sum(axis=1)    distances = sqDistancesMat**0.5    sortedDistances = distances.argsort()    classCount = []    for i in range(k):        predictLabel = dataSetLabel[sortedDistances[i]]        classCount.append(predictLabel)    frequent = Counter(classCount)    return frequent.most_common(1)[0][0]

上面没有测试数据,我自己做了一些数据测试,全中!bingo!



0 0
原创粉丝点击