《基于Python语言的机器学习系统设计》--序

《基于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

 

 

 

 

 


                    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值