NumPy、SciPy、Matplotlib,Python下机器学习三大利器。上一篇讲了NumPy基础操作,这节讲讲SciPy和Matplotlib。目前接触到的东西不多,以后再遇到些比较常用的再更新。
scipy是基于numpy的扩充,所以安装时要先安装numpy再安装scipy。scipy的命名空间包含numpy,所以只需import scipy即可,numpy不用import。(所以以下有些东西可能是numpy里的我没分清楚,反正一并写了吧。)
1 | import scipy as sp |
首先从文件导入数据,使用genfromtxt函数。文件是《Python语言构建机器学习系统(第二版)》里提供的数据:web_traffic.tsv。读取后把x与y分开。而且里面有几个nan数据,得事先踢掉:
1 | data = sp.genfromtxt("web_traffic.tsv",delimiter="\t") |
然后我们想可视化这些数据,以图表给出,那就用到matplotlib了:
1 | plt.scatter(x, y, s=6) # 在图标上产生散点,s代表绘制的点的粗细 |
最后plt.show()
以显示窗口。

这里写图片描述
然后我们用二次函数作为模型,并使得函数最好的适应数据。
1 | fp,residuals,rank,sv,rcond = sp.polyfit(x,y,2,full=True) |
polyfit函数直接帮我们找到了这个使得方差最小的直线的参数,参数存在f1p里面。里面那个参数2就代表产生二次函数,3代笔3次函数,50就是50次函数。我们print fp,得到:
1 | [ 1.05322215e-02 -5.26545650e+00 1.97476082e+03] |
1 | [ 1.79983508e+08] |
poly1d将参数转换成可识别的函数格式,可以把它当做普通python的函数用。注意是poly“1”d,是1不是l。不知道有没有poly2d。
1 | f = sp.poly1d(fp) |
linspace函数产生一次函数从x=0到x=x[-1]区间内的函数的值,作为一维矩阵存储。1000那个数字代表产生几个值,数字越大产生的值越多。当然对于一次函数,值为2其实就够了。
1 | fx = sp.linspace(0,x[-1],1000) |
值为1000时: 这里写图片描述
值为5时: 这里写图片描述
就只计算了5个值,明显弧度不行了。
然后以下plot函数就是把得到的二次函数放到figure上的。legend产生左上角那个d=2标示。
1 | plt.plot(fx,f(fx),linewidth=2) |
同理可得其他次数的最佳适应的函数。以下写了个小小的成品,计算了一次、二次、五十三次函数:
1 | import scipy as sp |

这里写图片描述
v1.5.2