Python3 Knn~鸢尾花分类

2018/10/21~2
鸢尾花是一种花。。。
它又有好几种类型,这里就需要把这几种类型分辨出来

获取数据

见百度云:我的百度云、提取码:6lh4

开始了

1、准备工作

import numpy as np
import pandas as pd
import operator

2、读取数据

#得到鸢尾花的数据
def getExcel():
    #先打开文件再读取能避免路径或文件名出现中文名的错误
    f = open('iris.csv')
    iris=pd.read_csv(f)
    return iris

3、因为这些数据一开始就是干净的,所以这里不考虑清洗,直接将这些数据分为测试集和训练集就好了。随机抽取10个数据当测试集,其他的当做训练集。(ps:话说10个是不是有点少。。。)

#将鸢尾花的数据分开为测试集与训练集
def irisDataClassification(iris):
    #得到10个随机数
    indexs=np.random.permutation(len(iris))
    indexs=indexs[0:10]
    #将测试集弄出来
    testSet=iris.take(indexs)
    #总的数据集干掉测试集就是训练集
    trainingSet=iris.drop(indexs)
    sets=[testSet,trainingSet]
    return sets

4、knn方法,这里省去了开根号的那一步,话说开了根号比大小貌似和直接比大小没啥区别吧,还多了步运算。
这里只考虑了离相应测试数据最近的训练数据,可以优化成多个相近的训练数据,比如:和测试数据最近的3个点

#K-近邻分析
#trainingSet训练数据,testSet是测试数据
def knn(trainingSet,testSet,trainingResults):
    #numpy函数shape[0]返回dataSet的行数
    totalsSize = trainingSet.shape[0]
    #将测试数据变成和训练数据一样的矩阵
    tests = np.tile(testSet, (totalsSize, 1)) - trainingSet
    #二维特征相减后平方
    sqDiffMat = tests**2
    #sum()所有元素相加,sum(0)列相加,sum(1)行相加
    sqDistances = sqDiffMat.sum(axis=1)
    #返回distances中元素从小到大排序后的索引值
    sortedDistIndices = sqDistances .argsort()
    #取出第一个元素的类别
    voteIlabel = trainingResults[sortedDistIndices[1]]
    #返回第一个元素的类别
    return voteIlabel

5、开始调用,并看看准确率

iris=getExcel()
sets=irisDataClassification(iris)
#species是数据集中分类的那一列,这里得到了训练集的数据和训练集的答案
trainingSet=sets[1].drop(columns=['species']).values
trainingResults=sets[1]['species'].values
#测试集
testSets=sets[0].values
#记录成功的次数
sta=0
for i in testSets:
	#额,这里为啥是4个呢。。因为数据集中有花萼的长宽、花瓣的长宽,所以有4个
    testSet=[i[0],i[1],i[2],i[3]]
    ret=knn(trainingSet,testSet,trainingResults)
    #如果返回的答案和测试数据的答案一样sta+1
    if ret==i[4]:
        sta+=1
successRate=sta/len(sets[0])
print('测试成功率为:\n',successRate)

看看结果吧:
在这里插入图片描述
运行两次的结果。。果然10个测试集是假的呀,应该多分一点给测试集的

总结

测试集的数量不要太少,发现在下也是有数学天赋的呀,记住了
在这里插入图片描述
就差不多了吧

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值