前言

也算是自己接触的第一个实例化的完整实现的小项目了吧(以前的的作业之类的都是没完全弄懂就交了不算哈),本此分享为简易鸢尾花的分类,实现语言是python 3.7,实现环境就是jupyter notebook。

1.数据集简介

本次数据集是从sklearn库中导入的load_iris()数据集,数据分四列,分别代表花萼长度、花萼宽度、花瓣长度、花瓣宽度,标签列或者说是target列有三种花种的类别数据表示分别是:'setosa', 'versicolor', 'virginica';在数据集中以0,1,2 的形式展示。在本次实验中选择的是二分类任务这就要求我们对数据集进行一定的划分(这点的代码方面给了我很大的提升,个人觉得受益匪浅,我入坑的前进道路进了一大步)

importnumpy as npimportmatplotlib.pyplot as pltfrom sklearn.datasets importload_irisfrom pylab importmpl

iris=load_iris()

iris.feature_names, iris.target_names,iris.target,iris,data # 显示你需要看的所有数据

2.看看数据

下面我们来看看数据集的具体数字,如下图所示,四列是feature_names的数据,也就是花萼的有关数据,中间一行是target 也就是标签--花的种类,可以看到有50个0、50个1、50个2。

3.筛选数据并可视化

接下来就是数据筛选,我们选择二分类需要的数据,在这里决定对0和1进行分类,数据选择为前一百个。利用花萼长度和花萼宽度进行一个预测,四个数据的以此类推大致输出就是z = sigmoid(w1x1 + w2x2),w是权重值,x是特征。

1 x = iris.data[0:100,0:2] #数据选择0到100行。前两列的标签数据,也就是0与1的花萼花瓣的数据

2 y = iris.target[0:100] #这是选中对应的前100个标签数据

3 samples_0 = x[y == 0,:] #samples-0 是标签 y==0的集合

4 samples_1 = x[y == 1,:] #samples-1 是标签 y==1的集合

5 plt.scatter(samples_0[:,0],samples_0[:,1],marker ='o',color = 'r')6 plt.scatter(samples_1[:,0],samples_1[:,1],marker ='o',color = 'b') #画出散点图

7 mpl.rcParams['font.sans-serif'] = ['SimHei'] #没有这行代码,画出的图的xy轴标签数据会乱码没发现显示

8 plt.xlabel("花萼长度")9 plt.ylabel("花萼宽度")

显示的图像如下:

接下来就是划分训练集和测试集;由于原始数据排列得很好所以我们要有预谋的进行打乱

xtrain = np.vstack([x[0:40,:],x[60:100,:]]) #选中X的前40行和60到99行的数据,列数为X的所有列虽然只有2列

ytrain = np.concatenate([y[0:40],y[60:100]]) #把x对应的标签数据对应挑出来

xtest = x[40:60,:] #把剩下的当作数据集

ytest = y[40:60] #剩下的标签当作数据集

xtest.shape,ytest.shape

4.设计函数模型并输出

接下来就是定义Logistic类和各种函数了:

classLR():def __init__(self):

self.w= None #w就是我们要训练的权重值

defsigmoid(self,z):

a= 1/(1+ np.exp(-z)) #也可以用lambda函数进行设置

returnadef output(self,x): #输出嘛,肯定是经过sigmoid激活函数进行转换

z =np.dot(self.w,x.T)

a=self.sigmoid(z)returnadefcomloss(self,x,y):

numtrain= x.shape[0] #x 是数据 y是标签 输出的是x的行数,将0变成1就是列数

a =self.output(x)

loss= np.sum(-y * np.log(a) - (1-y)*np.log(1-a))/numtrain #自定义的损失函数,可以在这里进行调试

dw = np.dot((a-y),x) / numtrain #dot就是向量之间点乘的函数,dw是导数,这里用了梯度下降法

returnloss,dwdef train(self,x,y,learningrate = 0.1,num_interations = 10000 ): #学习率就是梯度下降的直接影响步长的量,10000是迭代次数

numtrain,numfeatures =x.shape

self.w= 0.001 * np.random.randn(1,numfeatures)

loss=[]for i inrange(num_interations):

error,dw=self.comloss(x,y)

loss.append(error)

self.w-= learningrate * dw #更新权重

if i % 200 == 0: #每200次进行一次损失输出

print('steps:[%d/%d],loss: %f' %(i,num_interations,error))returnlossdefpredict(self,x):

a=self.output(x)

ypred= np.where(a >= 0.5,1,0)returnypred

LR=LR()

loss=LR.train(xtrain,ytrain)

plt.plot(loss)

输出:

steps:[0/10000],loss: 0.692566steps:[200/10000],loss: 0.237656steps:[400/10000],loss: 0.155935steps:[600/10000],loss: 0.121161steps:[800/10000],loss: 0.101404steps:[1000/10000],loss: 0.088442steps:[1200/10000],loss: 0.079171steps:[1400/10000],loss: 0.072148steps:[1600/10000],loss: 0.066605steps:[1800/10000],loss: 0.062095steps:[2000/10000],loss: 0.058337steps:[2200/10000],loss: 0.055146steps:[2400/10000],loss: 0.052395steps:[2600/10000],loss: 0.049991steps:[2800/10000],loss: 0.047869steps:[3000/10000],loss: 0.045979steps:[3200/10000],loss: 0.044280steps:[3400/10000],loss: 0.042744steps:[3600/10000],loss: 0.041346steps:[3800/10000],loss: 0.040068steps:[4000/10000],loss: 0.038892steps:[4200/10000],loss: 0.037806steps:[4400/10000],loss: 0.036800steps:[4600/10000],loss: 0.035864steps:[4800/10000],loss: 0.034990steps:[5000/10000],loss: 0.034173steps:[5200/10000],loss: 0.033405steps:[5400/10000],loss: 0.032683steps:[5600/10000],loss: 0.032002steps:[5800/10000],loss: 0.031358steps:[6000/10000],loss: 0.030749steps:[6200/10000],loss: 0.030170steps:[6400/10000],loss: 0.029621steps:[6600/10000],loss: 0.029097steps:[6800/10000],loss: 0.028599steps:[7000/10000],loss: 0.028122steps:[7200/10000],loss: 0.027667steps:[7400/10000],loss: 0.027231steps:[7600/10000],loss: 0.026813steps:[7800/10000],loss: 0.026413steps:[8000/10000],loss: 0.026028steps:[8200/10000],loss: 0.025657steps:[8400/10000],loss: 0.025301steps:[8600/10000],loss: 0.024958steps:[8800/10000],loss: 0.024627steps:[9000/10000],loss: 0.024308steps:[9200/10000],loss: 0.023999steps:[9400/10000],loss: 0.023701steps:[9600/10000],loss: 0.023413steps:[9800/10000],loss: 0.023134

损失表达图像:

可以看出来经过梯度下降法的不断迭代其损失不断下降。

经过训练,权重值已经算出来了,接下来对其进行一个可视化;

plt.scatter(samples_0[:,0],samples_0[:,1],marker ='o',color = 'r')

plt.scatter(samples_1[:,0],samples_1[:,1],marker ='o',color = 'b')

mpl.rcParams['font.sans-serif'] = ['SimHei']

plt.xlabel("花萼长度")

plt.ylabel("花萼宽度")

x1= np.arange(4,7.5,0.05) # 数据都是根据 数据集合理设置的 目的是为了不留太多空白

x2= (-LR.w[0][0]* x1)/LR.w[0][1] #

plt.plot(x1,x2,'-',color = 'black')

输出图像为;

为了便于读者理解,在这里加两行代码进行分析:

numtest =xtest.shape[0]

prediction=LR.predict(xtest)

acc= np.sum(prediction == ytest)/numtestprint("准确率",acc)

LR.w#输出最终预测的权重值

输出:

准确率 0.95

array([[ 6.4110022 , -11.06167206]])

好了 到此为止,预测,损失,训练的权重值,准确率都出来了,本次实验比较简单,但是折射出很多细节问题,还是值得小白入手训练的。

贴一下完整代码(其实上面就是完整了,为了减少学生白嫖党的烦恼还是总结一下吧,毕竟我也是这么过来的哈哈):

importnumpy as npimportmatplotlib.pyplot as pltfrom sklearn.datasets importload_irisfrom pylab importmpl

iris=load_iris()

iris.feature_names, iris.target_names

x= iris.data[0:100,0:2]

y= iris.target[0:100]

samples_0= x[y == 0,:] #samples-0 是标签 y==0的集合

samples_1 = x[y == 1,:] #samples-1 是标签 y==1的集合

plt.scatter(samples_0[:,0],samples_0[:,1],marker ='o',color = 'r')

plt.scatter(samples_1[:,0],samples_1[:,1],marker ='o',color = 'b')

mpl.rcParams['font.sans-serif'] = ['SimHei']

plt.xlabel("花萼长度")

plt.ylabel("花萼宽度")#划分数据集

xtrain = np.vstack([x[0:40,:],x[60:100,:]]) #原始x 定义的是两列数据

ytrain = np.concatenate([y[0:40],y[60:100]]) #原始y 是标签值

xtest = x[40:60,:]

ytest= y[40:60]

xtest.shape,ytest.shapeclassLR():def __init__(self):

self.w=Nonedefsigmoid(self,z):

a= 1/(1+ np.exp(-z))returnadefoutput(self,x):

z=np.dot(self.w,x.T)

a=self.sigmoid(z)returnadefcomloss(self,x,y):

numtrain= x.shape[0] #x 是数据 y是标签 输出的是x的行数,1就是列数

a =self.output(x)

loss= np.sum(-y * np.log(a) - (1-y)*np.log(1-a))/numtrain

dw= np.dot((a-y),x) /numtrainreturnloss,dwdef train(self,x,y,learningrate = 0.1,num_interations = 10000):

numtrain,numfeatures=x.shape

self.w= 0.001 * np.random.randn(1,numfeatures)

loss=[]for i inrange(num_interations):

error,dw=self.comloss(x,y)

loss.append(error)

self.w-= learningrate * dw #更新权重

if i % 200 ==0:print('steps:[%d/%d],loss: %f' %(i,num_interations,error))returnlossdefpredict(self,x):

a=self.output(x)

ypred= np.where(a >= 0.5,1,0)returnypred

LR=LR()

loss=LR.train(xtrain,ytrain)

plt.plot(loss)

plt.scatter(samples_0[:,0],samples_0[:,1],marker ='o',color = 'r')

plt.scatter(samples_1[:,0],samples_1[:,1],marker ='o',color = 'b')

mpl.rcParams['font.sans-serif'] = ['SimHei']

plt.xlabel("花萼长度")

plt.ylabel("花萼宽度")

x1= np.arange(4,7.5,0.05)

x2= (-LR.w[0][0]* x1)/LR.w[0][1]

plt.plot(x1,x2,'-',color = 'black')

numtest=xtest.shape[0]

prediction=LR.predict(xtest)

acc= np.sum(prediction == ytest)/numtestprint("准确率",acc)

LR.w#输出最终预测的权重值

建议从上而下依次复现才会理解。

python鸢尾花分类_基于python的鸢尾花二分类相关推荐

  1. python 英语分词_基于Python NLTK库进行英文文本预处理

    文本预处理是要文本处理成计算机能识别的格式,是文本分类.文本可视化.文本分析等研究的重要步骤.具体流程包括文本分词.去除停用词.词干抽取(词形还原).文本向量表征.特征选择等步骤,以消除脏数据对挖掘分 ...

  2. 基于python爬虫数据处理_基于Python爬虫的校园数据获取

    苏艺航 徐海蛟 何佳蕾 杨振宇 王佳鹏 摘要:随着移动时代的到来,只适配了电脑网页.性能羸弱的校园教务系统,已经不能满足学生们的移动查询需求.为此,设计了一种基于网络爬虫的高实用性查询系統.它首先通过 ...

  3. 基于python的网站_基于Python的网站爬虫应用研究

    基于 Python 的网站爬虫应用研究 陈清 [期刊名称] <通讯世界> [年 ( 卷 ), 期] 2020(027)001 [摘要] 如何于海量的互联网网站中获取有用资源信息 , 对网站 ...

  4. python实现文件共享_基于Python的分布式文件共享系统的实现

    龙源期刊网 http://www.qikan.com.cn 基于 Python 的分布式文件共享系统的实现 作者:朱亚林 纪宏伟 来源:<智能计算机与应用> 2015 年第 04 期 摘 ...

  5. python机器视觉教材_基于Python的机器视觉实验教学平台设计

    基于 Python 的机器视觉实验教学平台设计 韩志豪 ; 刘晓英 [期刊名称] <计算机测量与控制> [年 ( 卷 ), 期] 2020(028)003 [摘要] 针对机器视觉领域的学习 ...

  6. python画球鞋_基于Python爬虫原理的篮球鞋选择程序的设计与实现

    基于 Python 爬虫原理的篮球鞋选择程序的设计与实现 张世元 [期刊名称] <通讯世界> [年 ( 卷 ), 期] 2019(026)002 [摘要] 伴随着篮球鞋工艺的进步及产业升级 ...

  7. python空间数据处理_基于Python语言的空间数据处理

    龙源期刊网 http://www.doczj.com/doc/7b0e0476172ded630a1cb662.html 基于Python语言的空间数据处理 作者:何丽娴甘淑陈应跃 来源:<价值 ...

  8. python空间数据处理_基于Python的空间数据批量处理方法

    第 34 卷 第 4 期 2011 年 8 月 测绘与空间地理信息 GEOMATICS & SPATIAL INFORMATION TECHNOLOGY Vol. 34,No. 4 Aug. ...

  9. python信息采集管理系统_基于Python的求职信息采集分析系统设计与实现

    基于 Python 的求职信息采集分析系统设计与实现 关鑫洁 ; 黄思奇 ; 位磊 [期刊名称] <计算机时代> [年 ( 卷 ), 期] 2020(000)003 [摘要] 为了便于求职 ...

  10. python 身份证识别器_基于Python的身份证验证识别和数据处理

    淚眼2000 发表于:2020-11-14 13:42 阅读: 164次 今天给大家分享关于基于Python的身份证验证识别和数据处理的文章,我看过之后受受益匪浅,希望对大家的学习有所帮助,如果觉得有 ...

最新文章

  1. 给博客增加了一个主题Nautica02Liquid
  2. 独家 | 11步转行数据科学家 (送给数据员/ MIS / BI分析师)
  3. EasyPHP-Devserver-17的坑位
  4. 神经网络与机器学习 笔记—核方法和径向基函数网络(下)
  5. SVN更新数据和提交数据的几个疑问
  6. php比较两个变量的值_总结PHP不用第三个变量交换两个变量的值的几种方法
  7. html输入格式限制,jQuery输入框限制输入内容格式插件
  8. vs中readfile的作用_脚本中和在解释器中使用 fs.readFile() 得到不同的结果
  9. 最新基于高德地图的android进阶开发(6)感兴趣点(POI)周边搜索源码浅析
  10. Lowagie 导出html的内容到 pdf
  11. 《廊桥遗梦》这样确切的爱,一生只有一次
  12. cocos2dX 之音乐与音效
  13. xshell报错-要继续使用此程序,您必须应用最新的更新或使用新版本
  14. 防止用户调整微信浏览器字体大小导致的显示异常
  15. 卷积与反卷积(转置卷积)关系的公式推导 及其各自的形式
  16. 连锁酒店网络互联解决方案
  17. 百融云创今日敲钟上市,正式登陆港交所主版
  18. 【生信分析】clusterProfiler: universal enrichment tool for functional and comparative study(3)
  19. html制作学生成绩表,学生成绩查询系统的制作方法——Excel篇
  20. mysql 日期比较_详解Mysql中日期比较大小的方法

热门文章

  1. 时间序列分析软件Hector用户手册(二)
  2. C语言/C++基础之小猪佩奇
  3. 使用Dreamweaver轻松实现网页中透明Flash效果
  4. 985博士生盲审未过!学界泰斗喊冤后决定带他去港科大重读博士?
  5. python 画图--饼图
  6. SpringCloud实现微信消息推送
  7. 【java】在线编程网站推荐
  8. equation buu
  9. CSS速成手册(2)
  10. 使用uniapp开发微信公众号(H5页面),用微信开发者工具调试微信公众号