《基于Python语言的机器学习系统设计》--序
目录
前
对Numpy 包包简单介绍
对Scipy 包包简单介绍
小结
前
今天开始接触机器学习部分,所使用的参考教材为Willi Richert 和Luis Pedro Coelho所编写的《Building Machine Learning Systems with Python》(译:基于Python语言的机器学习系统设计),本教材是基于py2.7所写,而自己现在要学习py3,所以在学习的过程中还需要对部分编码进行修改, 好的,我已经准备好了,满书的bug向我砸过来吧~
工欲善其事,必先利其器。首先安装:Numpy Scipy Matplotlib三个包包
sudo apt-get update#对安装器进行升级
sudo apt-get upgrade#对安装器进行升级
sudo apt-get install python3-pip#安装py3的包获取器
pip3 install numpy
pip3 install scipy
pip3 install matplotlib
#堆上几块砖速度会更快呦~~~(别问我这个砖怎么堆,问就不知道)
对Numpy 包包简单介绍
如下:(教材搬运)
1.查看版本号
>>> import numpy
>>> numpy.version.full_version
'1.18.5'
2.对arry进行实验
>>> import numpy as np
>>> a = np.array([0,1,2,3,4,5])
>>> a
array([0, 1, 2, 3, 4, 5])
>>> a.ndim #维度
1
>>> a.shape
(6,)
3.如2所示,使用array创建数组,其类似于在python中创建一个list,虽然list可以创建成list的list,但是list是没有维度可言的,而array就有一个纬度的说明就是它的dimensional和shape。
>>> b = a.reshape(3,2)
>>> b
array([[0, 1],
[2, 3],
[4, 5]])
>>> b.ndim
2
>>> b.shape
(3, 2)
如果对b中的数字进行更改,则a中的数据也会发生改变,我们可以把它理解成(肉夹馍)和(饼、肉、饼)的关系,两个实际上是一个东西,只是名字和形状不同而已,其区别也仅此而已。
但如果,我现在想b对a进行复制,而不是简简单单起个别名这么简单,那我们可以使用这个方法:b = a.reshape(3,2).copy(),这样a和b就是独立的两个变量了。
4.array能直接进行乘方运算,是不是很神奇?list没有这个功能。
>>> a**2
array([ 0, 1, 4, 9, 16, 25])
>>> [0,1,2,3,4,5]**2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
5.索引功能
>>> a[[2,3,4]]#访问a数组中下标为2 3 4的元素
array([2, 3, 4])
>>> a[np.array([2,3,4])]#同上
array([2, 3, 4])
>>> a>4#判断a中每个元素和4的关系
array([False, False, False, False, False, True])
>>> a[a>4]#筛选a中比4大的元素
array([5])
>>> a[a>4] = 2 #把a中大于4的元素修改成2
>>> a
array([0, 1, 2, 3, 4, 2])
>>> a.clip(2,4)#把比2小的改为2,大于4的改为4
array([2, 2, 2, 3, 4, 4])
5.使用np.NAN 代表一个 空值,用例如
>>> c = np.array([1,2,np.NAN,3,4])
>>> c
array([ 1., 2., nan, 3., 4.])
>>> np.isnan(c)#判断c中每个元素是否为空值
array([False, False, True, False, False])
6.用c[~np.isnan(c)] 可以获取c中非空的元素值
通过上述几个示例可以总结:array[ 判断条件 ] 可以对该数组中的元素进行筛选。
7.其他函数
np.dot()#矩阵乘法函数
#若改为a.dot(a),其中a为array格式数组,则为a*a然后结果相加
np.arange(**)#生成1~**的数组
对Scipy 包包简单介绍
如下:(教材搬运)
上代码
import scipy as sp #引包,数据处理
import matplotlib.pyplot as plt #引包,作图
data = sp.genfromtxt("web_traffic.tsv",delimiter="\t") #获取数据
x = data[:,0]#将数据按照维度进行提取
y = data[:,1]
x = x[~sp.isnan(y)]#对空值的数据进行清洗
y = y[~sp.isnan(y)]
plt.scatter(x,y)
plt.title("web traffic over the last month")
plt.xlabel("time") #x轴名称
plt.ylabel("Hits/hour") #y轴名称
plt.xticks([w*7*24 for w in range(10)],['week %i' %w for w in range(10)])
#对这个函数的理解是:第一个参数是把横坐标轴看作是一条标准的直线轴,在上边按照第一个参数(list)对显示的坐标轴间距进行重写,可以对第一个参数中的某些数据进行更改进行试验
#第二个参数是横轴坐标名称,还有第(3~n)个参数,它们是对显示的颜色旋转等进行自定义设置
plt.autoscale(tight = True)
#对坐标轴范围进行自适应调整,在这里tight = True ,简单来讲就是将坐标轴的最大值设置为数据中的最大值,使图像看着更加紧凑美观
plt.grid()#显示网格
plt.show()#显示图像
下面的代码,函数,变量先糊涂用,后面再清楚学。
def error(f,x,y):
return sp.sum((f(x) -y)**2)
fp1,residuals,rank,sv,rcond = sp.polyfit(x,y,1,full = True)
#fp1 返回两个数据a、b,解释为 最合适的函数是 y = a*x +b
#residuals 是所有的数据对于此拟合函数的方差和,其结果等同于下面操作
f1 = sp.poly1d(fp1)#emmm,这是1不是l
#下面对第一个训练模型进行显示(emmm,说实话,我没认为这是一个什么训练模型,就是一个简简单单的拟合,但是,书上说是,就是呗~)
fx =sp.linspace(0,x[-1],1000)
plt.plot(fx,f1(fx),linewidth=4)
plt.legend(["d=%i" % f1.order], loc="upper left")
plt.show()
#后面的几个示例就是对polyfit(x,y,1,full = True)中的1进行值的变化2~100,其实就是现实中函数的幂次,此处不过与赘述。
#是不是幂次越高,拟合越贴近,拟合函数越好?显然不是,因为在极端的情况下,函数可以和数据极高度拟合,这时部分数据中是有噪声数据的(由于极小概率事件引起的数据变化),那此时可以被称为过度拟合(overfitting)。概念可自行百度。
#下一步,我们尝试着对数据进行再次观察,重新拟合#按照教材所说,在第三周和第四周之间数据趋势发生了明显的变化,所以把和数据分成了两部分进行两次拟合
inflection = int(3.5*7*24) #设置中间节点
xa = x[:inflection]
ya = y[:inflection]
xb = x[inflection:]
yb = y[inflection:]
fa = sp.poly1d(sp.polyfit(xa,ya,1))
fb = sp.poly1d(sp.polyfit(xb,yb,1))
小结
书上说,Congratulations!
大意是到这里接触了机器学习两个重要的东西,一个是花费时间去理解和精炼数据,第二个是正确的实验步骤,训练与测试的不同(不知道翻译的对不对,暂且按照这样理解)。
还有一点是不要把精力放在那些花里胡哨的算法上,我们的主要目的是数据。
参考书籍
1、Willi Richert / Luis Pedro Coelho. Building Machine Learning Systems with Python[M] Packt Publishing.2013-7-26