模式识别的一个实验,要求画出贝叶斯决策的图。这里我是利用python中的matplotlib库实现的图线的拟合。主要对于matplotlib的使用可以参照博客:webary
如果要绘制三维图像可以参考博客:python绘制三维图
具体实现:
接下来,就是对具体数据进行绘图了。比如我们要绘制一条y=x^2的曲线,可这样写代码:
x = range(10) # 横轴的数据 y = [i*i for i in x] # 纵轴的数据 pl.plot(x, y) # 调用pylab的plot函数绘制曲线 pl.show() # 显示绘制出的图
可以看到,要显示一个图非常简单,只要有了两个list作为输入数据,先后调用plot和show函数就可以了。一定要记得只有调用了show之后才会显示出来!只有plot是不行的!在实际运用中,可能这样一条简单粗暴的线可能并不是我们想要的最好的结果,比如,想要在图形上显示原始数据点,很简单,只要在plot函数中加上一个参数即可: pl.plot(x, y,'ob-') # 显示数据点,并用蓝色(blue)实现绘制该图形
这个参数用法比较灵活,可以从下面的值中组合选择:
颜色(color 简写为 c): 蓝色: 'b' (blue) 绿色: 'g' (green) 红色: 'r' (red) 蓝绿色(墨绿色): 'c' (cyan) 红紫色(洋红): 'm' (magenta) 黄色: 'y' (yellow) 黑色: 'k' (black) 白色: 'w' (white) 线型(linestyle 简写为 ls): 实线: '-' 虚线: '--' 虚点线: '-.' 点线: ':' 点: '.' 点型(标记marker): 像素: ',' 圆形: 'o' 上三角: '^' 下三角: 'v' 左三角: '<' 右三角: '>' 方形: 's' 加号: '+' 叉形: 'x' 棱形: 'D' 细棱形: 'd' 三脚架朝下: '1'(像'丫') 三脚架朝上: '2' 三脚架朝左: '3' 三脚架朝右: '4' 六角形: 'h' 旋转六角形: 'H' 五角形: 'p' 垂直线: '|' 水平线: '_'
线是调好了,可是还想加上横纵坐标的说明呢?也很简单,在调用show函数之前添加如下代码:
pl.xlabel(u"我是横轴") pl.ylabel(u"我是纵轴")
这里一定要记住,传递的字符串一定要是Unicode编码,如果是直接传入字符串,形式如 u'这里是要写的字符串' 即可。
现在就直观多了吧,终于像一个正常的图了,不过,还想再在图里加个图例该咋办?也不难,继续给plot传参数:
pl.plot(x, y, 'ob-', label=u'y=x^2曲线图') # 加上label参数添加图例 pl.legend() # 让图例生效
oh,看到图像上面光秃秃的,就好想给它加个标题: pl.title(u'图像标题') # 字符串也需要是unicode编码 有时候,我们的数据可能分布并没有这么集中,比如我们想要对项目中的某些数据进行绘图观察时发现,大量数据聚集在0附近,而少量很大的数据会导致图像显示效果很不好,比如:
x = range(10)+[100] y = [i*i for i in x] pl.plot(x, y, 'ob-', label=u'y=x^2曲线图')
这时,我们想要限制需要显示的坐标范围:
pl.xlim(-1, 11) # 限定横轴的范围 pl.ylim(-1, 110) # 限定纵轴的范围
这里是我实验的实现部分:
# -*- 环境:python 3 -*- # -*- 代码于https://www.cnblogs.com/doggod/p/9917638.html -*- import cmath lis = [-3.9847,-3.5549,-1.2401,-0.9780,-0.7932,-2.8531,-2.7605,-3.7287,-3.5414,-2.2692,-3.4549,-3.0752,-3.9934,2.8792,-0.9780,0.7932,1.1882,3.0682,-1.5799,-1.4885,-0.7431,-0.4221,-1.1186,4.2532] pw1=0.9;pw2=0.1;e1=-2.0;a1=0.5;e2=2.0;a2=2.0 #定义所给的常数 def func(x,a,b): #求正态分布的函数 return ( 1.0/(cmath.sqrt(2.0*(cmath.pi.real)).real)*b*(cmath.exp(-1.0*(x-a)*(x-a)/2.0/b/b).real)); point1 = [];pot1 = [] #为后面作图所画点集的list/正常点 point2 = [];pot2 = [] #为后面作图所画点集的list/异常点 for t in lis: #遍历所给细胞,判断所给的细胞是否是异常细胞 p1 = (pw1 * func(t, e1, a1)) / (pw1 * func(t, e1, a1) + pw2 * func(t, e2, a2)) p2 = (pw2 * func(t, e2, a2)) / (pw1 * func(t, e1, a1) + pw2 * func(t, e2, a2)) if(p1>=p2): print(0,' ',end='') point1.append(t) pot1.append(0); else: print(1,' ',end='') point2.append(t) pot2.append(0); import matplotlib.pyplot as plt #引入matplotlib与numpy - python画图工具 import numpy as np plt.figure('拟合图像') #定义名字 x1=[];y1=[] #存储后面linspace函数所产生点的list为拟合图像做准备 x2=[];y2=[] a=np.linspace(-5,8,100) #产生均匀点 for i in a: x1.append(i) y1.append((pw1 * func(i, e1, a1)) / (pw1 * func(i, e1, a1) + pw2 * func(i, e2, a2))) #计算所给i的后验概率 x2.append(i) y2.append((pw2 * func(i, e2, a2)) / (pw1 * func(i, e1, a1) + pw2 * func(i, e2, a2))) plt.plot(x1,y1,label= u'normal cell' ) #画出正常点的线 plt.plot(x2,y2,label= u'abnormal cell' ) #画出异常点的线 plt.xlabel(u"Cell attribute value") #为x轴取名 plt.ylabel(u"Post continuation probability") #为y轴取名 plt.plot(point1,pot1,'gp') #画出点集 plt.plot(point2,pot2,'mx') plt.legend() #显示图例 plt.show()
实现结果如图所示: