机器学习笔记(五):numpy入门
2016-11-25 12:45
218 查看
numpy入门
我们学机器学习,为什么要学numpy库和matplotlib库了?估计这是很多人刚开始跟我一样疑惑。机器学习技术核心就是大数据处理,你需要处理大量的数据进行算法模型训练。因此,我们需要一个能迅速处理大量数据的工具。其实,无论C语言、java等都可以实现机器学习算法,机器学习就是一些数学理论模型用程序实例化,可以来解决很多实际问题。我们选择python语言的一个非常重要的原因,就是其有丰富的大数据处理所用的库,并且程序实现简单。numpy就是其中最基础的一个。numpy是一个矩阵库,提供了大量的矩阵处理函数。
我们生活中所用的汽车的车架,是一个非常复杂的结构。我们怎么能够保证其能安全可靠了?答案是工程师在机械设计的时候要进行受力分析。复杂结构的受力分析的基础是弹性力学理论,而弹性力学理论的基本上以偏微分方程为主,解偏微分方程是一个非常复杂的过程,记得大学时,一个老教授用2个小时解了一道偏微分方程。聪明的科学家,其实早就发现这个问题了,因此发明了偏微分方程的数值解法。其核心就是利用矩阵计算大量迭代,最后逼近一个真实的解。我们的机器学习也是一样的。
numpy虽然是一个矩阵库,但其共提供两种数据类型:数组和矩阵。
numpy入门
python常用的数据类型
元组tuple
创建
取值
常用方法
列表list
创建
取值
常用方法
字典dict
创建
取值
常用方法
数组array
创建
元素访问
常用方法
矩阵matrix
创建
元素访问
常用方法
python常用的数据类型
在正式开始numpy库学习之前,我们先来回顾一个python中几个序列类型的数据类型。主要有:元组、列表、字典。让我们迅速的复习一下:元组(tuple)
创建
>>>t1=()#创建一个空元组 >>>t1 () >>>t2=(1,)#创建一个单值元组 >>>t2 (1,) >>>t3=(1,2,3)#纯数字 >>>t3 (1,2,3) >>>t4=('bamboo',26,'male')#可以为字符串 >>> t4 ('bamboo', 26, 'male')
取值
#索引取值 >>> t3[0] 1 >>> t3[1] 2 >>> t4[0] 'bamboo'
常用方法
>>> len(t1)#求元组长度 0 >>> len(t3) 3 >>> t3*2 (1, 2, 3, 1, 2, 3) >>> max(t3)#求元组中的最大值 3 >>> min(t3)#求元组中的最小值 1 >>> type(t3)#查看类型 <type 'tuple'>
元组中的值不可以修改
列表(list)
创建
>>> list1=[1,2,3] >>> list1 [1, 2, 3] >>> list2=['my','name','is','bamboo']#可以为字符串,元组 >>> list2 ['my', 'name', 'is', 'bamboo']
取值
>>> list2[0]#索引取值 'my' >>> list1[0] 1
常用方法
>>> len(list1)#求长度 3 >>> max(list1)#求最大值 3 >>> min(list1)#求最小值 1 >>> type(list1)#查看类型 <type 'list'> >>> list1.append(4)#项列表中添加一个元素 >>> list1 [1, 2, 3, 4] >>> list1.remove(3)#删除一个元素 >>> list1 [1, 2, 4] >>> list1=[1,2,3,4] >>> list1 [1,2,3,4] >>> list1.remove(list1[3])#删除一个元素 >>> list1 [1,2,3] >>> list1[2]=1#给元素重新赋值 >>> list1 [1, 2, 1]
1、列表可以删除和修改内部元素。2、注意观察删除一个元素的操作,需要直接删除其值
字典(dict)
创建
>>> dict1={1:'a',2:'b',3:'c'}#创建一个字典 >>> dict1 {1: 'a', 2: 'b', 3: 'c'}
取值
>>> dict1.keys()#返回key列表 [1, 2, 3] >>> dict1.values()#返回value列表 ['a', 'b', 'c'] >>> dict1.items()#返回键值对列表 [(1, 'a'), (2, 'b'), (3, 'c')] >>> dict1.iterkeys()#key列表迭代器 <dictionary-keyiterator object at 0x0216F8A0> >>> dict1.itervalues()#value列表迭代器 <dictionary-valueiterator object at 0x0216F750> >>> dict1.iteritems()#键值对迭代器 <dictionary-itemiterator object at 0x0216F8A0> #迭代器取值的方法 >>> iter_key=dict1.iterkeys() >>> iter_key.next() 1 >>> iter_key.next() 2 >>> iter_key.next() 3 >>> iter_key.next()#当迭代器内值取完后,会报异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
常用方法
>>> len(dict1)#求长度 3 >>> dict1.get(1)#通过键值,获得value 'a' >>> dict1.get(4,'d')#通过键值,获得value。如果key值不存在,就返回默认值 'd' >>> dict1#通过get方法取值后,原字典不发生变化 {1: 'a', 2: 'b', 3: 'c'}
数组(array)
标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。NumPy的诞生弥补了这些不足。创建
创建numpy的array类型数据时,首先要导入所用到的库。导入方式有两种。第一是,直接导入array模块
>>> from numpy import array
这样就可以直接利用,array创建数组。
>>> array1=array([1,2,3]) >>> array1 array([1, 2, 3])
第二是,你可以导入numpy库,再用numpy.array创建数组。
>>> import numpy as np >>> array1=np.array([1,2,3]) >>> array1 array([1, 2, 3])
两种方法都能创建出数组,最后结果都是一样的。
在机器学习中,我们更多的是创建多维数组,其实也很简单。
>>> array2=array([[1,2,3],[4,5,6],[7,8,9]])#创建多维数组 >>> array2 array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
元素访问
array的元素访问的方式有两种:第一,同list一样,通过索引访问
>>> array1[0] 1 >>> array2[0] array([1, 2, 3]) >>> array2[0][1] 2
第二,按照矩阵方式访问
>>> array2[0,1] 2
第三,取出一行或者一列
>>> x array([[ 0.92830929, 0.08101871], [ 0.88281788, 0.98998765], [ 0.56750088, 0.48316892]]) >>> x[:,0]#取出一列 array([ 0.92830929, 0.88281788, 0.56750088])
常用方法
求数组的大小。len()方法也可以求出数组的大小,但当遇到多维数组时,只能求出第一个参数。
>>> array1.shape (3,) >>> array2.shape (3, 3) >>> len(array1) 3 >>> len(array2) 3
神奇的加减乘除
大家很容易将array和list搞混淆。主要区别在运算上,并且array运算速度更快
array:加减乘除都是对每个元素操作
list:是把list做为一个整体来操作的
让我们先定义两个arrary及两个list
>>> array1=array([1,2,3]) >>> array2=array([1,2,3]) >>> list1=[1,2,3] >>> list2=[1,2,3]
加法运算:不但可以array和一个数字相加,也可以将两个array相加。list会做为一个整体,同字符串相加一样将2个list连接起来
>>> array1+2#直接与数字相加,给每个元素加一个数值 array([3, 4, 5]) >>> array1+array2#array加法 array([2, 4, 6]) >>> list1+list2#list加法 [1, 2, 3, 1, 2, 3]
减法运算:相当于加一个负数。而list会报错
>>> array1-1#直接与数字相减,同加法相同,会个每个元素减一个数 array([0, 1, 2]) >>> array1-array2#array减法 array([0, 0, 0]) >>> list1-list2#list不能实现减运算,会报异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for -: 'list' and 'list'
乘法运算:乘法也很简单,也可以实现同数字运算,也可以与array运算,也是将各个元素分别相乘。
由于list不能进行乘法就不在列举
>>> array1*2#array乘法 array([2, 4, 6]) >>> list1*2#list乘法,会将两个list连接起来 [1, 2, 3, 1, 2, 3] >>> array1*array2 array([1, 4, 9])
除法运算
除法运算同上
>>> array1/2#array除法 array([0, 1, 1]) >>> array1/array2 array([1, 1, 1])
乘方运算:乘方运算是个非常常用的运算,在这儿列举一下
>>> array1**2#array的乘方运算 array([1, 4, 9])
tips: array运算都是针对各个元素的 |
矩阵(matrix)
创建
矩阵的创建同数组相同,传入列表即可。注意是:两个括号的列表>>> from numpy import mat,matrix >>> mat2#一维矩阵 matrix([[1, 2, 3]]) >>> mat3=matrix([[1,2,3],[4,5,6],[7,8,9]])#多维矩阵 >>> mat3 matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
元素访问
在矩阵中,你可以返回其中一个元素,也可以返回其中一行。1、返回一个元素
>>> mat2[0,1] 2 >>> mat2[0,:] matrix([[1, 2, 3]]) >>> mat3[1,2] 6
2、返回矩阵中的其中一行
>>> mat3[2,:]#返回一行 matrix([[7, 8, 9]])
常用方法
求矩阵的大小:同样也是用shape参数,得到:(行数,列数)>>> mat2.shape (1, 3) >>> mat3.shape (3, 3) >>> mat3.shape[0] 3 >>> mat3.shape[1] 3 >>> mat2.shape[0] 1 >>> mat2.shape[1] 3
神奇的加减乘除
看了array的加减乘除是不是觉得很实用,很方便了。
但是矩阵的加减乘除可以分为两种:数字+矩阵、矩阵+矩阵
– 那就先来说数字+矩阵吧
创建个矩阵来实验
>>> mat1=mat([[1,2,3],[4,5,6],[7,8,9]]) >>> mat1 matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
⎡⎣⎢147258369⎤⎦⎥(mat1)
加减:会实现同array一样的效果,减法相当于加个负数不再举例
>>> mat1+1 matrix([[ 2, 3, 4], [ 5, 6, 7], [ 8, 9, 10]])
乘除:同上
>>> mat1*2 matrix([[ 2, 4, 6], [ 8, 10, 12], [14, 16, 18]]) >>> mat1/0.5 matrix([[ 2., 4., 6.], [ 8., 10., 12.], [ 14., 16., 18.]])
– 矩阵+矩阵
再创建个矩阵来实验
>>> mat2=mat([[3,2,1]])
[321](mat2)
加减:会实现同array一样的效果,会给每行对应的元素加,减法相当于加个负数不再举例
>>> mat1+mat2 matrix([[ 4, 4, 4], [ 7, 7, 7], [10, 10, 10]])
乘法:
>>> mat1*mat2 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", line 341, i n __mul__ return N.dot(self, asmatrix(other)) ValueError: objects are not aligned
咦,貌似刚才用法不起作用了。那是肯定的,如果继续一样,就没有必要创建矩阵这个类了。让我们把大学线性代数再捡回来。记得老师说过这么一句话:
两个矩阵相乘必须是这种(x,m)*(m,y)格式,即第一个矩阵的列数=第二个矩阵的行数 |
是不是可以了?
>>> mat1*mat2.T matrix([[10], [28], [46]])
让我们稍微复习一下,线性代数中矩阵的乘法
⎡⎣⎢321⎤⎦⎥(mat3)
⎡⎣⎢147258369⎤⎦⎥⎡⎣⎢321⎤⎦⎥=⎡⎣⎢1×3+2×2+3×14×3+5×2+6×17×3+8×2+9×1⎤⎦⎥=⎡⎣⎢102846⎤⎦⎥
tips:大家一定得记住这种算法,在以后机器学习的算法要经常遇到 |
>>> from numpy import multiply >>> multiply(mat1,mat2) matrix([[ 3, 4, 3], [12, 10, 6], [21, 16, 9]])
终于写完
下个笔记要更加深入一点了,这个先入个门
相关文章推荐
- cs229 斯坦福机器学习笔记(一)-- 入门与LR模型
- 一、机器学习系统设计笔记之python机器学习入门
- [笔记]我的Linux入门之路 - 05.Eclipse的Python开发环境搭建与Numpy、Scipy库安装
- python语法笔记——NumPy入门
- 深入理解机器学习:从原理到算法 学习笔记-第1周 02简易入门
- NumPy学习笔记--入门篇
- [机器学习入门] 李宏毅机器学习笔记-2 (Regression:Case Study ;回归:案例研究)
- 机器学习入门笔记——线性回归
- KNN--用于手写数字识别(机器学习入门笔记)
- (转载)机器学习知识点(二十九)LDA入门级学习笔记
- 程序员的机器学习入门笔记(一):基本概念介绍
- 机器学习笔记(0)-有趣的机器学习:最简明入门指南
- python学习笔记之numpy入门
- 程序员的机器学习入门笔记(八):最优化与计算复杂度概述
- 程序员的机器学习入门笔记(六):决策树的入门介绍
- 机器学习之入门Numpy
- 机器学习笔记(一)机器学习入门之旅
- 程序员的机器学习入门笔记(三):数据挖掘中矩阵的那些事
- 程序员的机器学习入门笔记(十):人脸识别核心算法PCA的前世与今生(强烈推荐)
- [机器学习入门] 李宏毅机器学习笔记-1(Learning Map 课程导览图)