上一篇《零基础入门机器学习-tensorflow(一)》非常简单的介绍了机器学习,今天就来谈谈在使用Python开发tensorflow机器学习应用前需要的必要知识储备(Python部分)。
Python的版本与安装
我有专门写文章介绍了Python及Tensorflow的安装方法,建议Python直接安装3.X版本,下面是文章链接:《从零开始搭建tensorflow人工智能开发环境(MAC版)》
基础入门
如果有编程基础,学习Python的过程非常容易,可能几天的学习就能基本入门,即便没有编程基础,Python的学习也不会特别困难,你大概需要掌握这些基本知识:
1. Python的数据类型,了解整型、浮点、字符串、布尔值及变量的定义和使用
2. list、tuple、dict、set数据结构的使用,这是python中使用最广泛的数据结构,尤其在tensorflow中会经常用到,所以一定学会非常熟练的使用
3. 条件判断、循环等语法,做几个小练习就能掌握
4. 函数的定义和使用
5. 掌握切片、迭代等数据操作方法
以上是使用tensorflow所需用到Python的基础知识,建议多练习,熟练使用,推荐一套在线教程:
Numpy库的使用
在机器学习过程中,我们操作的数据多为矩阵或多维数组,如果使用基本运算不仅算法过程复杂,而且效率极低,而numpy(Numerical Python)库提供了python对多维数组对象的支持,计算速度快了很多,操作上也非常简洁。
1. 数组定义
import numpy as np
# 一维数组
v = np.array([1, 2, 3, 4])
# 二维数组(矩阵)
m = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(v)
print(" ----------- ")
print(m)
输出结果:
[1 2 3 4]
-----------
[[1 2 3 4]
[5 6 7 8]]
需要注意的是,在numpy中定义的数组,其中的元素必须为同一类型,在定义数组时可以通过dtype指定类型,如果没有指定,则系统会自动选择匹配的类型,例如 [1, 2, 3, 4] 数组,系统会定义为int型,而 [1, 2.0, 3, 4] 因为其中2.0是浮点数,所以系统会为数组指定数据类型为float。
2. 数组的结构
import numpy as np
# 一维数组
v = np.array([1, 2, 3, 4])
# 二维数组
m = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(v.shape)
print(" ----------- ")
print(m.shape)
输出结果:
(4,) # 一维数组,元素数量为4
-----------
(2, 4) # 二维数组,行数为2,列数为4
3. 数组数据的类型更改
import numpy as np
v = np.array(['1', '2', '3', '4'])
v_float = v.astype(np.float32)
print(v.dtype)
print(v)
print(" ------------ ")
print(v_float.dtype)
print(v_float)
输出结果:
<U1
['1' '2' '3' '4']
------------
float32
[1. 2. 3. 4.]
4. 数据文件的打开
以打开CSV文件为例,使用numpy.genfromtxt函数获取数据,获取的数据可以直接打印出来:
import numpy as np
data = np.genfromtxt('/Users/Bruce/Desktop/test.csv', dtype=str, delimiter=',', skip_header=1)
print(data)
print(type(data))
输出结果:
[['1000001052' '1' '1521243729' ... '25.6' '59.5' '17.05']
['1000000080' '0' '1521297805' ... '31.61' '59.03' '29.65']
['1000000435' '1' '1521297819' ... '31.13' '61.08' '29.42']
...
['1000001823' '1' '1521497233' ... '33.28' '49.27' '32.49']
['1000001826' '0' '1521497236' ... '32.97' '47.25' '32.39']
['1000001824' '1' '1521497293' ... '33.68' '49.15' '33.01']]
<class 'numpy.ndarray'>
5. 数据的选取
通过print(data)可以打印出文件所有的数据,如果希望打印出指定位置的数据,可以使用以下方式:
import numpy as np
data = np.genfromtxt('/Users/Bruce/Desktop/test.csv', dtype=str, delimiter=',', skip_header=1)
#打印出第2行第3列的数据
print(data[1, 2])
输出结果:
1521297805
6. 数据的切片
a)一维数组的切片
import numpy as np
v = np.array([5, 10, 15, 20, 25])
print(v[1:3])
一维数组的切片 v[1:3] ,其中的“1”代表从第2位开始取值,“3”代表下标3之前的一位(即示例中的数值15),输出结果:
[10 15]
b)二维数组的切片
import numpy as np
m = np.array([[5, 10, 15, 20, 25], [3, 6, 9, 12, 15], [1, 2, 3, 4, 5]])
# 打印第3列的所有行的数据
print(m[:,2])
print(" ----------- ")
# 打印第1、2列的所有行的数据
print(m[:,0:2])
print(m[:,2]),其中的冒号代表所有行,2代表第3列,输出结果:
[15 9 3]
-----------
[[ 5 10]
[ 3 6]
[ 1 2]]
7. 数组的判断
import numpy as np
m = np.array([[5, 10, 15, 20, 25], [3, 6, 9, 12, 15], [1, 2, 3, 4, 5]])
# 数组中的值判断是否等于15
print(m == 15)
输出结果,返回bool值得数组结构:
[[False False True False False]
[False False False False True]
[False False False False False]]
“与”和“或”的操作:
import numpy as np
m = np.array([[5, 10, 15, 20, 25], [3, 6, 9, 12, 15], [1, 2, 3, 4, 5]])
# 数组中的值判断是否既等于15,又等于5
print((m == 15) & (m == 5))
print(" ------------ ")
# 数组中的值判断是否等于15或等于5
print((m == 15) | (m == 5))
输出结果:
[[False False False False False]
[False False False False False]
[False False False False False]]
------------
[[ True False True False False]
[False False False False True]
[False False False False True]]
8. 数组的计算
a) 数组求和
import numpy as np
m = np.array([[2, 4, 6, 8], [1, 5, 9, 14], [5, 10, 15, 20]])
print(m.sum(axis=0))
print(" ----------- ")
print(m.sum(axis=1))
其中axis=代表计算的维度,0代表在第一个维度内相加,也就是列相加;1代表在第二个维度内相加,也就是行相加,结果如下:
[ 8 19 30 42]
-----------
[20 29 50]
b)数组的加减乘除
import numpy as np
m = np.array([5, 10, 15, 20, 25, 30, 35, 40])
n = np.arange(1, 9, 1)
print('m + n = ', m + n)
print('m - n = ', m - n)
print('m * n = ', m * n)
print('m / n = ', m / n)
输出结果:
m + n = [ 6 12 18 24 30 36 42 48]
m - n = [ 4 8 12 16 20 24 28 32]
m * n = [ 5 20 45 80 125 180 245 320]
m / n = [5. 5. 5. 5. 5. 5. 5. 5.]
c)数组的矩阵乘法
import numpy as np
m = np.array([[1, 1], [0, 1]])
n = np.array([[2, 1], [4, 2]])
print('m dot n = ', np.dot(m, n))
输出结果:
m dot n = [[6 3]
[4 2]]
9. 数组的生成
a) arange
import numpy as np
m = np.arange(15)
print(m)
print(" ----------- ")
# 改变数组形状为5行3列
print(m.reshape((5, 3)))
输出结果:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
-----------
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]
[12 13 14]]
定义输出范围,下例中从5开始生成数值,步长为3,最后一位数值不超过18。
import numpy as np
m = np.arange(5, 18, 3)
print(m)
输出结果:
[ 5 8 11 14 17]
b)zeros、ones
import numpy as np
m_zeros = np.zeros((4, 3))
m_ones = np.ones((4, 3))
print(m_zeros)
print(" ------------ ")
print(m_ones)
输出结果:
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
------------
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
c)random
import numpy as np
m = np.random.random((3, 4))
print(m)
numpy.random.random会产生[0, 1)区间的随机数,输出结果如下:
[[0.79380161 0.28176742 0.82962069 0.60747785]
[0.14056924 0.64440438 0.64972462 0.8162096 ]
[0.41452382 0.82120787 0.22358394 0.30673285]]
d)linspace
import numpy as np
m = np.linspace(2.4, 130.3, 30)
print(m)
linspace可以在指定区间内,生成指定数量的数组,如上例中,生成从2.4到130.3区间中,平均分布的30个数值,输出结果如下:
[ 2.4 6.81034483 11.22068966 15.63103448 20.04137931
24.45172414 28.86206897 33.27241379 37.68275862 42.09310345
46.50344828 50.9137931 55.32413793 59.73448276 64.14482759
68.55517241 72.96551724 77.37586207 81.7862069 86.19655172
90.60689655 95.01724138 99.42758621 103.83793103 108.24827586
112.65862069 117.06896552 121.47931034 125.88965517 130.3 ]