KNN算法的实现

#!/usr/bin/env python
#-*-coding:utf-8-*-
#knn 的具体实现
import csv
import random
import math
import operator
#导入数据集 文件名,split区分那个集
def loadDataset(filename,split,trainintset=[],testSet=[]):
    with open(filename,'rb') 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)
#得到相邻的k个邻居
def getNeighbors(trainingSet,testInstance,k):
    distance=[]
    length=len(testInstance)-1
    #测试集的维度
    for x in range(len(trainingSet)):
        dist=euclideanDistance(testInstance,trainingSet[x],length)
        distance.append((trainingSet[x],dist))
    distance.sort(key=operatos.itemgetter(1))
    neighbors=[]
    for x in  range(k):
        neighbors.append(distances[x][0])
    return neighbors
#得到那个类占大多数

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
    sortedVotes=sorted(classVotes.iteritems(),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
    loadDataset(r'data.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)+'%')

main()







#!/usr/bin/env python#-*-coding:utf-8-*-#knn实现手写数字识别#1建立工程并导入sklearn包‘import numpy as npfrom os import listdir #使用listdir模块,用于访问本地文件from sklearn import neighbors#2加载训练数据#将加载的32*32的图片矩阵展开成一列向量def img2vector(fileName): retMat=np.zeros([1024],int)#定义返回的矩阵,大小为1*1024 fr=open(fileName)#打开包含32*32大小的数字文件 lines=fr.readlines()#读取文件的所有行 for i in range(32):#遍历文件所有行 for j in range(32):#并将01数字存放在retMat中 retMat[i*32+j]=lines[i][j] return retMat#定义加载训练数据的函数readDataSet;def readDataSet(path): fileList=listdir(path)#获取文件夹下的所有文件 numFiles=len(fileList)#统计需要读取的文件的数目 dataSet=np.zeros([numFiles,1024],int)#用于存放所有的数字文件 hwLabels=np.zeros([numFiles])#用于存放对应的标签(与神经网络的不同) for i in range(numFiles):#遍历所有的文件 filePath=fileList[i]#获取文件名称/路径 digit=int(filePath.split('_')[0])#通过文件名获取标签 hwLabels[i]=digit#直接存放数字,并非one-hot向量 dataSet[i]=img2vector(path+'/'+filePath)#读取文件内容 return dataSet,hwLabelstrain_dataSet,train_hwLabels=readDataSet('digits/trainingDigits/')#训练的图片,对应的标签#3构建KNN分类器knn=neighbors.KNeighborsClassifier(algorithm='kd_tree',n_neighbors=3)knn.fit(train_dataSet,train_hwLabels)#加载测试集dataSet,hwLabels=readDataSet('digits/testDigits/')#构建好的knn分类器对测试集进行预测,并计算预测的错误率res=knn.predict(dataSet)#对测试集进行预测error_num=np.sum(res!=hwLabels)#统计分类错误的数目num=len(dataSet)#测试集的数目print('Total num:',num,' wrong num:', error_num,' WrongRate:',error_num/float(num))




#!/usr/bin/env python
#-*-coding:utf-8-*-
#knn算法实例鸢尾花预测
from sklearn import neighbors
from sklearn import datasets

knn=neighbors.KNeighborsClassifier()
#加载数据
iris=datasets.load_iris()
#打印数据
print(iris)
#训练KNN分类器
knn.fit(iris.data,iris.target)
#KNN实验
predictedLabel=knn.predict([[0.1,0.2,0.3,0.4]])
print(predictedLabel)




结果解释:	
     鸢尾花的数据集
     数据代表花瓣的长宽,花萼的长宽
     预测目标target
     预测结果【0】
    
#!/usr/bin/env python
#-*-coding:utf-8-*-
#knn实现手写数字识别
#1建立工程并导入sklearn包‘
import numpy as np
from os import listdir #使用listdir模块,用于访问本地文件
from sklearn import neighbors
#2加载训练数据
#将加载的32*32的图片矩阵展开成一列向量
def img2vector(fileName):
    retMat=np.zeros([1024],int)#定义返回的矩阵,大小为1*1024
    fr=open(fileName)#打开包含32*32大小的数字文件
    lines=fr.readlines()#读取文件的所有行
    for i in range(32):#遍历文件所有行
        for j in range(32):#并将01数字存放在retMat中
            retMat[i*32+j]=lines[i][j]
    return retMat
#定义加载训练数据的函数readDataSet;
def readDataSet(path):
    fileList=listdir(path)#获取文件夹下的所有文件
    numFiles=len(fileList)#统计需要读取的文件的数目
    dataSet=np.zeros([numFiles,1024],int)#用于存放所有的数字文件
    hwLabels=np.zeros([numFiles])#用于存放对应的标签(与神经网络的不同)
    for i in range(numFiles):#遍历所有的文件
        filePath=fileList[i]#获取文件名称/路径
        digit=int(filePath.split('_')[0])#通过文件名获取标签
        hwLabels[i]=digit#直接存放数字,并非one-hot向量
        dataSet[i]=img2vector(path+'/'+filePath)#读取文件内容
    return dataSet,hwLabels
train_dataSet,train_hwLabels=readDataSet('digits/trainingDigits/')
#训练的图片,对应的标签
#3构建KNN分类器
knn=neighbors.KNeighborsClassifier(algorithm='kd_tree',n_neighbors=3)
knn.fit(train_dataSet,train_hwLabels)
#加载测试集
dataSet,hwLabels=readDataSet('digits/testDigits/')
#构建好的knn分类器对测试集进行预测,并计算预测的错误率
res=knn.predict(dataSet)#对测试集进行预测
error_num=np.sum(res!=hwLabels)#统计分类错误的数目
num=len(dataSet)#测试集的数目
print('Total num:',num,' wrong num:', error_num,' WrongRate:',error_num/float(num))


     
      结果解释:
   	  预测实例946, wrong  num 为10  WrongRate 为 0.010570824524312896 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值