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个测试集是假的呀,应该多分一点给测试集的
总结
测试集的数量不要太少,发现在下也是有数学天赋的呀,记住了
就差不多了吧