面壁者Z 发布的文章

PYPLOT(PYTHON中绘制2D图表)使用详解(二)

在学习机器学习与PYTHON的相关内容中,接触到了pyplot这个子库,感觉非常有用,可是网络上的文章大部分都是比较零散的,于是打算按照官方文档,进行一个简单翻译与演示,详细记录一下该库的使用方法。这是本系列的第二篇,每篇大约讲解20个方法,但有些方法官方也未给出详细的用法,待以后使用中慢慢摸索后再补充。

二、方法介绍(21~40)

21、draw() —— 重新绘制当前figure

主要用于更新一个没有设置为自动更新的figure,应用于交互环境中

参考代码:待补充

22、savefig() —— 保存当前figure

来自于Figure.savefig类,用于将当前figure输出到postscript

基本格式:

savefig(fname, dpi=None, facecolor='w', edgecolor='w',
        orientation='portrait', papertype=None, format=None,
        transparent=False, bbox_inches=None, pad_inches=0.1,
        frameon=None)

参数说明:

dpi:[None | scalar>0] 每英寸的分辨率
facecolor,edgecolor:matplotlib色彩 figure图像颜色
orientation: ['landscape'|'portait'] 不支持所有的后台,目前只能在PostScript输出
papertype:'letter','legal','executive','ledger','a0' through 'a10', 'b0' throuth 'b10'等 纸张类型
format: png,pdf,ps,eps,svg等,扩展名
transparent:透明度
frameon:[True|False] 背景图是否现实
bbox_inches: 'tight' 边缘空白区域大小设置

参考代码:

import matplotlib.pyplot as plt
plt.figure(1)
plt.plot([1,3,3,8])
plt.savefig('D:\\python\\ML\\test')

操作结果(在指定目录生成了test.png图片):

2345截图20170322170424.png

23、ginput() —— 交互式标注

可以利用该工具实现图像中点的拾取等操作

参考代码:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg  # 用于导入图片
print(plt.gci()) # 在未向plt中添加内容时,返回None
img = mpimg.imread('D:\\python\\ML\\test.png')  # 导入图片
plt.imshow(img)  # 将图片在plt中显示
print('Please click 3 porints') # 输出一个提示语句
x = plt.ginput(3)  # 捕获用户点击坐标
print(x) # 打印坐标

操作结果:

2345截图20170322171959.png

2345截图20170322172131.png

暂时请忽略这个报错。

24、waitforbuttonpress() —— 监听键盘按键

如果用户按的是键盘,返回True,如果是其他(如鼠标单击),则返回False

参考代码:

import matplotlib.pyplot as plt
plt.figure(1) # 创建figure
plt.grid() # 展示网格
print('Please enter a key') # 提示按键
a = plt.waitforbuttonpress() # 捕捉按键
print(a) # 打印捕捉返回结果

操作结果:

1、按下某个键盘按键,返回True

2345截图20170322173014.png

2、单击鼠标,返回False

2345截图20170322173107.png

25、figtext() —— 为figure添加文字

参考代码:

import matplotlib.pyplot as plt
plt.figure(1)
plt.figtext(0.5,0.5,'Hello!') # 前两个参数为坐标,取值范围0~1,0.5表示中间,第三个参数是文字内容
plt.show()

操作结果:

2345截图20170325105357.png

26、suptitle() —— 为figure添加总标题

参考代码:

import matplotlib.pyplot as plt
plt.figure(1)
plt.suptitle('Hello!')
plt.show()

操作结果:

2345截图20170325105556.png

27、figimage() —— 添加一个非重采样图像

[待补充]

28、figlegend(arg1,arg2,arg3) —— 为figure添加图例

参数说明:
arg1:一条Line2D实例
arg2:字符串,图例的说明
arg3:图例的位置,对应的位置如下图:

2345截图20170325110935.png

参考代码:

import matplotlib.pyplot as plt
plt.figure(1)
line = plt.plot([1,3,3,4]) # 生成一条Line2D
plt.figlegend(line,'a',10) # 将该图例设置为a,位置在中间
plt.show()

操作结果:

2345截图20170325110800.png

28、hold() —— 锁定当前状态

[待补充] 这里的锁定状态与坐标轴axes有关,看起来像是要锁定当前图像。但是在pyplot中,可以在不锁定的情况下继续绘制第二条线路并不影响。这个问题后边再说。

29、ishold() —— 返回锁定状态

[待补充] 还未研究透彻

30、over() —— 以Hold(True)的方式调用函数并保存当前状态

[待补充]

30、axes() —— 为figure添加axes(坐标轴)

参考代码:

import matplotlib.pyplot as plt
rect = [0.1,0.1,0.8,0.8] # [left,bottom,width,height]
plt.axes(rect,facecolor='y') # 生成坐标体系,取值范围rect,颜色:yellow
plt.show()

操作结果:

2345截图20170325152353.png

31、delaxes() —— 删除坐标轴

参考代码:

import matplotlib.pyplot as plt
rect = [0.1,0.1,0.8,0.8] # [left,bottom,width,height]
a = plt.axes(rect,facecolor='y') # 生成坐标体系,取值范围rect,颜色:yellow
plt.delaxes(a) # 删除黄色的坐标体系
a = plt.axes(rect,facecolor='b') # 生成坐标体系,取值范围rect,颜色:blue
plt.show()

操作结果:

2345截图20170325152606.png

32、sca() —— 为ax设置当前坐标轴

[待补充]

33、gca() —— 获取当前实例,用于设置属性

[待补充] 经测试,可以通过plt.gca() 捕获当前坐标体系,但无法通过set设置属性,也无法输出

34、subplot(行,列,序号,背景色) —— 在一个图表中绘制多个子图

注意序号决定了放在哪个格子中,从左到右、从上到下依次增加

演示代码:

import matplotlib.pyplot as plt
plt.subplot(1,2,1,axisbg = 'y') # 在一行两列格子中放置1号图,背景为黄色
plt.subplot(1,2,2,axisbg = 'b') # 在一行两列格子中放置2号图,背景为蓝色
plt.show()

操作结果:

3.png

35、supplots() —— 顾名思义,一次弄多张图

演示代码:

import matplotlib.pyplot as plt
plt.subplots(2,2)
plt.show()

操作结果:

2345截图20170325161356.png

36、subplot2grid() —— 在网格中创建subplot

演示代码:

import matplotlib.pyplot as plt
plt.subplot2grid((2,2),[0,1])  # 添加2行2列的网格,并将图形放置到1行2列[0,1]
plt.show()

操作结果:

2345截图20170325161955.png

37、twinx() —— 绘制与之前axes图轴共用x轴的axes,新的图将被放在右侧。如果ax=None,则覆盖ax,并返回ax2

演示代码:

import matplotlib.pyplot as plt
ax = plt.subplot2grid((1,2),[0,0])
plt.twinx(ax)
plt.show()

操作结果:

2345截图20170325162604.png

38、twiny() —— 使用方法类似twinx,不同的是变成了y轴

演示代码:

import matplotlib.pyplot as plt
plt.subplot2grid((1,2),[0,0])
plt.twinx()
plt.twiny()
plt.show()

操作结果:

2345截图20170325162721.png

39、subplots_adjust() —— 调整subplot布局

参数:subplots_adjust(left=None, bottom=None, right=None, top=None,
wspace=None, hspace=None),参数取值[0,1]

参考代码:

import matplotlib.pyplot as plt
plt.plot([1,2,3,3])
plt.subplots_adjust(left=0.2, bottom=0.1, top=0.3)
plt.show()

操作结果:

2345截图20170325163140.png

40、subplot_tool() —— 打开图像的subplot工具窗口

可以通过点击蓝色进度条,调整图形参数。

演示代码:

import matplotlib.pyplot as plt
plt.plot([1,2,3,3])
plt.subplot_tool()
plt.show()

操作结果:

2345截图20170325163447.png

PYPLOT(PYTHON中绘制2D图表)使用详解(一)

在学习机器学习与PYTHON的相关内容中,接触到了pyplot这个子库,感觉非常有用,可是网络上的文章大部分都是比较零散的,于是打算按照官方文档,进行一个简单翻译与演示,详细记录一下该库的使用方法。

一、pyplot简介

pyplot是matplotlib库的一个子库,提供了类似MATLAB的绘图方法,虽然没有MATLAB功能强大,但是对于想学习如何在PYTHON环境下练习机器学习的初学者来说,是一个比较方便的小工具。它主要用来绘制2D图表,例如:

2345截图20170320213030.png

通过对数据进行图形化展示(有点像EXCEL里生成折线图的功能),可以直观的了解数据的分布情况,更好的制定出学习方法。同时,它还可以展示出我们机器学习到的计算方法,了解其与实际情况是否相符等问题。如上图中的黄色虚线,是我通过学习算法得出了数据模拟走势。

二、方法介绍

1、show() —— 显示图形界面。

当我们将图形界面配置完成后,通过调用show()方法来展示界面。

参考代码:

import matplotlib.pyplot as plt # 从matplotlib库导入子库pyplot,缩写为plt
plt.grid() # 显示网格,后面介绍
plt.show() # 显示图形

效果如图所示:

2345截图20170320214345.png

2、isinteractive() —— 返回交互模式状态,布尔值

该命令的作用是返回一个布尔值(True OR False),以此确定交互模式的开关。
该命令决定了是否视图窗口绘图面板在每个pyplot命令后都绘制,如果为False,则每个命令后都更新(但只会在调用draw()命令后才进行绘制)。如果设置为True,则每个pyplot命令都会重新绘制。
该命令与以下四个命令配合密切:
ion() 打开交互模式
ioff() 关闭交互模式
draw() 强制窗口重新绘制

参考代码:暂无

3、ioff() —— 关闭交互模式

参考代码:

import matplotlib.pyplot as plt
print(plt.isinteractive()) # 默认返回False
plt.ion() # 打开交互模式
print(plt.isinteractive()) # 模式已打开,返回True
plt.ioff() # 关闭交互模式
print(plt.isinteractive()) # 模式已关闭,返回False

4、ion() —— 打开交互模式

参考代码:

同3、ioff()

5、pause() —— 暂停若干秒

该命令用于暂停运行,有点类似sleep,但不同之处在于,如果有活动的内容,暂停期间,GUI事件循环仍然会继续运行,就像一个简单的动画。当然,真正动画实现,请参考matplotlib库的animation子库。

参考代码:

import matplotlib.pyplot as plt
print('Pause start')
plt.pause(3) # 暂停3秒
print('Pause end')

效果如下:

2345截图20170321100421.png

6、rc、tc_context、rcdefaults,实际上是同步了matplotlib的同名子类,这里不说了,将来我们在相关文章中专门来说。

7、gci() —— 获取当前元素的基本属性(待编辑)

该命令功能不太明确,我尝试了一下,如果给plt中赋值了,那么会返回一个元组,里面包含图片尺寸等;如果plt为空,则返回None。

参考代码:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg  # 用于导入图片
print(plt.gci()) # 在未向plt中添加内容时,返回None
img = mpimg.imread('D:\\python\\test.png')  # 导入图片
plt.imshow(img)  # 将图片在plt中显示
plt.axis('off') # 关闭坐标轴
print(plt.gci()) # 打印当前plt中内容的属性,返回AxesImage(80,52.8;496x369.6)
plt.show() # 展示plt更直观的看到图像

操作结果:

2345截图20170321105946.png

8、sci() —— 设置当前图像(Set Current Image)(待编辑)

这张图片将作为地图的目标,类似于jet()方法,当前图像是当前轴的属性。
还不是很清楚怎么用。

9、setp() —— 设置或获取artist属性

比如设置一个线段的属性为短间隔线

参考代码:

import matplotlib.pyplot as plt
line = plt.plot([1,3,3,4]) # 设置一条趋势线
setp(line, linestyle='--') # 设置线的格式为短间隔线
plt.show() # 展示plt

操作结果:

2345截图20170321165154.png

10、xkcd() —— 素描风格绘图模式

他只会对你设置后的代码起作用,而且建议提前安装字体“Humor Sans”

参考代码:

import matplotlib.pyplot as plt
with plt.xkcd(): # 采用素描风格绘图模式
    plt.plot([1,3,3,4]) # 随意设置一组数字方便演示
    plt.show() # 展示内容

操作结果:

2345截图20170321171305.png

11、figure() —— 创建图表

用于创建图表,可创建多个,可通过参数指定序号/分辨率/背景色等信息

参考代码:

import matplotlib.pyplot as plt
plt.figure(1, dpi=100, facecolor='r') # 创建图表1,主色用红色r,分辨率100
plt.plot([1,3,3,4])  # 随意输入个折线
plt.grid() # 显示网格
plt.figure(2, dpi=70, facecolor='b') # 创建图表2,主色用蓝色b,分辨率70
plt.plot([1,3,3,4])
plt.grid()
plt.show()

操作结果:

2345截图20170321213356.png

12、gcf() —— 获取当前figure的尺寸

参考代码:

import matplotlib.pyplot as plt
plt.figure(1)
plt.grid()
print(plt.gcf()) # 返回: Figure(640×480)
plt.show()

操作结果:

2345截图20170321214512.png

13、fignum_exists(num) —— 判断figure编号是否存在,返回布尔值

参考代码:

import matplotlib.pyplot as plt
plt.figure(1)
print(plt.fignum_exists(1))  # 返回True
print(plt.fignum_exists(2))  # 返回False

操作结果:

2345截图20170321214810.png

14、get_fignums() —— 获取figures序号的数组

参考代码:

import matplotlib.pyplot as plt
plt.figure(1)
plt.figure(2)
plt.figure(3)
print(plt.get_fignums())

操作结果:

2345截图20170321215024.png

15、get_figlabels() —— 获取所有figures的标签的数组

未测试到理想结果。缺少相关参考文档。

16、get_current_fig_manager() —— 获取当前的figure的manager的ID

参考代码:

import matplotlib.pyplot as plt
plt.figure(1)
print(plt.get_current_fig_manager().num)
plt.figure(2)
print(plt.get_current_fig_manager().num)

操作结果:

2345截图20170321221149.png

17、connect() —— 作用暂未明确

该方法继承自:FigureCanvasBase.mpl_connect

18、disconnect() —— 作用暂未明确

该方法继承自:FigureCanvasBase.mpl_connect

19、close() —— 关闭figure窗口

参考代码:

import matplotlib.pyplot as plt
plt.figure(1) # 创建窗口1
plt.figure(2) # 创建窗口2
plt.grid() # 窗口增加网格
plt.close(1) # 关闭窗口1
plt.show() # 展示剩余窗口

操作结果:只有窗口2会展示出来,因为窗口1已经关闭了。可以尝试删掉plt.close(1)这一行再试,会发现窗口1和窗口2都被打开了。

20、clf() —— 清空当前窗口

参考代码:

import matplotlib.pyplot as plt
plt.figure(1) # 创建窗口1
plt.grid() # 增加网格
plt.clf() # 清空窗口
plt.show() # 展示窗口

操作结果:注意已经将窗口清空了,如果去掉plt.clf()一行,会发现网格还有展示

2345截图20170322111003.png

一个初学者对机器学习的理解

我学习机器学习方面的知识有一周了,由于自己的数学,尤其是统计和概率太差劲,所以理解起里边的公式,就像在看天书一样。
我首先仔细听了12堂公开课,是吴恩达在斯坦福大学讲的,刚开始第一节可以说基本听懂了,但后边的就只能听,完全没办法跟上了。
然后又从网上搜了不少的相关介绍,通俗些的很少,可能是因为这东西很难讲通俗吧。
现在说说自己对机器学习的一些简单理解,理论不一定是正确的,过一段时间我也可能会有新的认识,所以前辈们还是多拍砖指教!
1、机器学习能干什么?
简单的说,就是你去调教一个程序,让程序试着自己去尝试解决问题。比如,预测房价,我们给机器提供一组房价和房屋的参数(面积、户型、朝向、楼层、地理位置等),让机器自己按照一定的公式,去尝试着找到计算方法,不断调整参数,最终找到了某个公式,例如:房价=面积×1000+户型×500+楼层×200……,通过该公式计算,能使得其恰好的符合我们给定数据的结果,就是这样算下来,我们给机器的那些参数算出来,恰好最接近真实的房价。然后,我们就可以得到这个算法(我们并不需要理解究竟是如何计算的),我们将房屋的情况输入给程序,程序就可以预测出房价。
要知道,如果这个操作用人来做,比如面积后面的参数1000,你可能需要从1尝试到10000甚至100000,然后再调整后面若干参数,你的一生也许就只够来写这一个程序了,时间耗费太多。而机器自己去学习解决这个问题,可能很快就能得出答案。而且,随着样本不断增加,机器就会越来越聪明。
当然,除了预测房价,这货还能预测股价,还能用来做人像比对(最强大脑有一期用童年照找现在的人就是百度大脑通过机器学习得到的)。
2、机器学习的分类
对我这个初学者来说,我只能大概的理解,监督学习和非监督学习两类,监督学习,是在有既定答案的情况下的学习,如前面的房价预测。非监督学习,则更复杂,是机器自己来对数据进行分类,可以应用在声音识别和分离上,他可以把两个混合在一起的嘈杂声音,清晰的分成两个独立的声音。你是不是在想,这一定超级复杂吧,因为这件事如果让人做,几乎是很难完成的。但是,在吴恩达的课里,这个操作,只需要一行代码!我了个擦。。。
3、如何学习机器学习?
其实我自己到现在仍然是一头雾水,毕竟有那么一点编程基础,本以为自己看看机器学习的理论,应该能很快入门,但是,当那些公式出现在我面前的时候,我才知道,门槛确实不低啊!
4、机器学习是否值得学习?
我的答案是,当然,即使你付出再大再多的努力,也应该努力的去学,为什么?原因实在太多了:
拉勾上机器学习的岗位,那都是20K起的,而机器学习几乎可以与我们任何一个领域发生关联,我们所从事的任何职业,机器学习都有用武之地。而且机器学习是人工智能的核心,学好了机器学习,我们将来才有可能在人工智能领域拥有一席之地。要知道,在未来,90%以上的职业,都会被人工智能取代,也许人工智能和艺术创作,将成为未来仅存的两大职业。
5、我想举几个行业可以应用的场景,当然有一些现在可能没成为现实,但将来一定会实现:
(1)人脸识别:我们不需要再随身带着身份证了,去ATM取钱,刷脸就行了!
(2)商品定价:根据大量的样本分析,可以自动得出最优的商品定价,按照这个定价,可以获得利润与销量的最优组合,什么薄利多销,那都是浮云。
(3)自动驾驶:想想真是有点小激动呢,因为自动驾驶的数据如果能够实现全球共享,那么自动驾驶系统的程序将会运行完美,车祸将从世界上消失。
(4)农业种植:通过让机器不断观察农作物的状态,调整灌溉、施肥、光照、温度的参数,得到最优组合,让农作物的产量大幅度提升。
(5)情感服务:情感机器人将根据人类的表情、动作、语言数据,理解人类的心理状态,并做出相应的反应。
(6)网络优化:这个可能比较泛泛,具体点,比如你家的路由器,应该放在什么位置,角度如何调整,可能晚上你睡觉时候在卧室,他会如何调整,你做饭时候在厨房,他又该如何调整。
(7)电视节目:学习你的使用习惯,在适当的时候给你提醒,比如你每天都在盯着某个电视剧,结果某一天忘记了,程序会提醒你,是不是要跳过去看看?

这样的例子实在太多,我真心的希望机器学习能应用到越来越多的领域,让我们的生活变得越来越好!

3分钟学编程系列之三:初识JavaScript

这是《3分钟学编程》系列第3篇,本系列小教程是专门针对刚开始学习WEB的朋友,力求简洁高效,希望你能够每天拿出3分钟的时间,来尝试一下编写代码的乐趣,了解一些基础的知识。注:本文不需要您下载任何工具软件,一切都用您电脑里现成的就可以完成。

前两天我们分别尝试了HTML和CSS,了解到,HTML是负责搭建页面的,CSS是负责装修页面的,那么我们经常听说的这个JavaScript是干什么的呢?今天我们就来试试。

不要被JavaScript这么长的名字唬住,其实他最然姓Java,但和Java几乎没有任何血缘关系,这货虽然是个盗版,但却实在是太强大了,以至于无论WEB怎样发展,JavaScript都没有被淘汰。

下面我们就来试试最简单的JavaScript:

第一步,用记事本打开我们第一期创建的那个hello.html。(如果找不到了,请前往第一期初识HTML)

第二步,在最上面添加如下JavaScript代码(简称JS代码):

<script> alert('Hello JS!'); </script>

第三步,保存,然后双击hello.html

OK,看到了吗?你向JS说出了第一句:Hello JS!

2345截图20170210201047.png

今天的操作到此完成,下面我们说下原理:

首先,JS代码可以直接写在html文件中,当然你也可以像CSS代码一样,单独创建一个文件,叫做hello.js,这个我们以后再说。
其次,JS代码是用script标签括起来的,括起来的意思是告诉浏览器:“嘿,浏哥!这里边是JS代码,请帮我调用JS引擎来执行!”。
第三,如果您测试时没有弹出窗口,可能是浏览器内核不支持,可以尝试换个主流点的浏览器试试。

原理说完了,如果意犹未尽,你还可以将alert后边引号中的内容换成任意你想要的内容,比如:滚一边去!

最后,送出今天学习《财富自由之路》中的一段心得,与朋友们共勉:

在学习和工作上,不要考虑是否要“押上全部”,而应该常态化的全情投入。这可能是唯一一件稳赢不输的投资了。

3分钟学编程系列之二:初识CSS

这是《3分钟学编程》系列第2篇,本系列小教程是专门针对刚开始学习WEB的朋友,力求简洁高效,希望你能够每天拿出3分钟的时间,来尝试一下编写代码的乐趣,了解一些基础的知识。注:本文不需要您下载任何工具软件,一切都用您电脑里现成的就可以完成。

上一篇我们写出了你的第一个HTML页面,叫做hello.html,接触了最简单的HTML代码,只有一行。如果您还保留着上一次做的页面,我们就在上一个页面的基础上,接触一下CSS,同样非常简单,代码只有两行。

如果您没看到上一篇,可以返回去看看,非常简单:3分钟写出你的第一个HTML页面

好了,今天的编程课要开始了哦!

第一步,在桌面上再新建一个文本文档,然后重命名为style.css。
2345截图20170209201825.png
第二步,右键单击后,选择“打开方式->记事本”,打开。
第三步,在里面写如下代码,保存:

h1 {color:#F00}

第四步,用记事本打开上一篇教程中创建的hello.html,在里面添加这样一行代码:

<link rel="stylesheet" href="style.css" />

这句代码稍微复杂那么一丁丁,意思是说,请调用当前目录下的style.css文件。

OK,代码操作到此完成。

看下效果吧!双击hello.html

2345截图20170209201908.png

看到文字变成红色了吗?
那么文字怎么变成红色的呢?这里就用到了今天要说的CSS(层叠样式表)
简单的说,CSS就是一个装修队,负责装修页面的,我们上面的一行代码,就是告诉浏览器,喂喂喂,请把所有的h1标签内容给我弄成#F00颜色。
然后我们在HTML文件中,调用了这个css文件style.css。
关于颜色值的表达方式,一般情况下,我们使用#号加6位的16进制数字来表示颜色,这种表示颜色的方式,基本足够我们人类的眼睛识别了。详细的关于16进制颜色值可以参考这里。我刚才使用的为什么只有三位呢?(#F00)因为#F00是#FF0000的缩写,在CSS中,如果色值的第1、2位,3、4位,5、6位分别重复,那么就可以只写1、3、5位的方式来表达。
你可以做以下尝试:
比如,修改一下色值,修改一下style.css的名字,看看会发生什么好玩的事情?

今天就讲到这里吧 感谢您的观看!