机器学习(二)机器学习的常用库之Numpy

python在机器学习领域得到广泛应用的重要原因之一是,python拥有庞大而活跃的第三方程序包,依托这些程序包,用户能够方便的完成绝大多数机器学习任务。

1.Numpy库

1.1特点:

  • 以N维数组对象形式组织数据集,其中要求数据集中各变量的类型相同
  • Numpy的一维数组对应向量,二维数组对应矩阵
  • Numpy拥有丰富的数学运算和统计函数,进行统计分析和矩阵运算十分方便

1.2numpy数组的创建和使用

import numpy as np
data = np.array([1,2,3,4,5,6,7,8,9])
print('Numpy的1维数组:\n{0}'.format(data))
print('数据类型:%s'%data.dtype)
print('1维数组中各元素扩大10倍:\n{0}'.format(data*10))
print('访问第二个元素:{0}'.format(data[1]))
data = np.array([[1,3,5,7,9],[2,4,6,8,10]])
print('Numpy的2维数组:\n{0}'.format(data))
print('数据类型:%s'%data.dtype)
print('访问2维数组中第一行第二列的元素:{0}'.format(data[0,2]))
print('访问2维数组中第一行第二列值第四列元素:{0}'.format(data[0,2:4]))
print('访问2维数组中第一行上所有元素:{0}'.format(data[0,:]))

执行结果

Numpy的1维数组:
[1 2 3 4 5 6 7 8 9]
数据类型:int32
1维数组中各元素扩大10倍:
[10 20 30 40 50 60 70 80 90]
访问第二个元素:2
Numpy的2维数组:
[[ 1  3  5  7  9]
 [ 2  4  6  8 10]]
数据类型:int32
访问2维数组中第一行第二列的元素:5
访问2维数组中第一行第二列值第四列元素:[5 7]
访问2维数组中第一行上所有元素:[1 3 5 7 9]

代码解释:

 data=numpy.array()创建数组,以列表的形式赋值,

如:[1,2,3,4,5,6,7,8,9]或者[[1,3,5,7,9],[2,4,6,8,10]] 一维数组data[i] 二维数组data[i,j]

data.dtype返回数组中的元素类型

data.shape返回数组的形状,既几行几列

对data的数学运算作用于全体元素 

1.3python列表与Numpy数组的对比

import numpy as np
data = [[1,2,3,4,5,6,7,8,9],['A','B','C','D','E','F','G','H','I']]
print('data是Python的列表(list):\n{0}'.format(data))
MyArray1 = np.array(data)
print('MyArray1是Numpy的N维数组:\n%s \nMyArray1的形状:%s'%(MyArray1,MyArray1.shape))

 执行结果

data是Python的列表(list):
[[1, 2, 3, 4, 5, 6, 7, 8, 9], ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']]
MyArray1是Numpy的N维数组:
[['1' '2' '3' '4' '5' '6' '7' '8' '9']
 ['A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I']] 
MyArray1的形状:(2, 9)

代码解释

numpy数组要求类型要一致,因此python列表转为数组时,数据类型不一致的元素转为相同类型

1.4Numpy数组的计算

import numpy as np
MyArray2 = np.arange(10)
print('MyArray2:\n{0}'.format(MyArray2))
print('MyArray2的基本描述统计量:\n均值:%f,标准差:%f,总和:%f,最大值:%f'%(MyArray2.mean(),MyArray2.std(),MyArray2.sum(),MyArray2.max()))
print('MyArray2的累计和:{0}'.format(MyArray2.cumsum()))
print('MyArray2的开平方:{0}'.format(np.sqrt(MyArray2)))
np.random.seed(123)
MyArray3 = np.random.randn(10)
print('MyArray3:\n{0}'.format(MyArray3))
print('MyArray3的排序结果:{0}'.format(np.sort(MyArray3)))
print('MyArray3的四舍五入到最近整数:{0}'.format(np.rint(MyArray3)))
print('MyArray3的各元素正负号:{0}'.format(np.sign(MyArray3)))
print('MyArray3的各元素非负数的显示正,负数显示负:{0}'.format(np.where(MyArray3>0,'正','负')))
print('MyArray3+MyArray2的结果:{0}'.format(MyArray3+MyArray2))

执行结果

MyArray2:
[0 1 2 3 4 5 6 7 8 9]
MyArray2的基本描述统计量:
均值:4.500000,总和:2.872281,最大值:9.000000
MyArray2的累计和:[ 0  1  3  6 10 15 21 28 36 45]
MyArray2的开平方:[0.         1.         1.41421356 1.73205081 2.         2.23606798
 2.44948974 2.64575131 2.82842712 3.        ]
MyArray3:
[-1.0856306   0.99734545  0.2829785  -1.50629471 -0.57860025  1.65143654
 -2.42667924 -0.42891263  1.26593626 -0.8667404 ]
MyArray3的排序结果:[-2.42667924 -1.50629471 -1.0856306  -0.8667404  -0.57860025 -0.42891263
  0.2829785   0.99734545  1.26593626  1.65143654]
MyArray3的四舍五入到最近整数:[-1.  1.  0. -2. -1.  2. -2. -0.  1. -1.]
MyArray3的各元素正负号:[-1.  1.  1. -1. -1.  1. -1. -1.  1. -1.]
MyArray3的各元素非负数的显示正,负数显示负:['负' '正' '正' '负' '负' '正' '负' '负' '正' '负']
MyArray3+MyArray2的结果:[-1.0856306   1.99734545  2.2829785   1.49370529  3.42139975  6.65143654
  3.57332076  6.57108737  9.26593626  8.1332596 ]

代码解释

MyArray2 = numpy.arange()用于生成指定范围内取值的一维数组

MyArray2.mean()计算数组元素的均值

MyArray2.std()计算数组元素的标准差

MyArray2.sum()计算数组元素的总和

MyArray2.max()计算数组元素的最大值

MyArray2.cumsum()计算数组元素的当前累计和

numpy.sqrt(MyArray2)对数组元素开平方

numpy.random.seed(123)指定随机数的种子,确保每次运行程序生成的随机数是一样的

MyArray3 = numpy.random.randn(10)生成包含10个元素且服从标准正态分布的一维数组 numpy.sort(MyArray3)对数组元素排序,排序结果并不覆盖原数组内容

numpy.rint(MyArray3)对数组元素做四舍五入

numpy.sign(MyArray3)计算各元素正负号,1表示正号,-1表示负号 numpy.where(MyArray3>0,'正','负'),依次对数组元素做逻辑判读,where内是一个三元组 MyArray3+MyArray2,数组相同位置上的元素相加 

 1.5矩阵初步

import numpy as np
np.random.seed(123)
X = np.floor(np.random.normal(5,1,(2,5)))
Y = np.eye(5)
print('X:\n{0}'.format(X))
print('Y:\n{0}'.format(Y))
print('X和Y的点积:\n{0}'.format(np.dot(X,Y)))

 执行结果

X:
[[3. 5. 5. 3. 4.]
 [6. 2. 4. 6. 4.]]
Y:
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]
X和Y的点积:
[[3. 5. 5. 3. 4.]
 [6. 2. 4. 6. 4.]]

 代码解释

numpy.random.normal(5,1,(2,5))生成元素服从均值为5标准差为1的2行5列的数组(矩阵) nunpy.floor() 得到距各数组元素最近的最大整数

numpy.eye(5) 生成一个5行5列的单位矩阵

numpy.dot(X,Y) 计算矩阵X和Y的矩阵乘积

1.6矩阵运算

from numpy.linalg import inv,svd,eig,det
X = np.random.randn(5,5)
print(X)
mat = X.T.dot(X)
print(mat)
print('矩阵mat的逆:\n {0}'.format(inv(mat)))
print('矩阵mat的行列式的值:\n{0}'.format(det(mat)))
print('矩阵mat的特征值和特征向量:\n{0}'.format(eig(mat)))
print('对矩阵mat做奇异值分解:\n{0}'.format(svd(mat)))

执行结果

[[-0.67888615 -0.09470897  1.49138963 -0.638902   -0.44398196]
 [-0.43435128  2.20593008  2.18678609  1.0040539   0.3861864 ]
 [ 0.73736858  1.49073203 -0.93583387  1.17582904 -1.25388067]
 [-0.6377515   0.9071052  -1.4286807  -0.14006872 -0.8617549 ]
 [-0.25561937 -2.79858911 -1.7715331  -0.69987723  0.92746243]]
[[ 1.6653281   0.3422329  -1.28839014  1.13288023 -0.47839144]
 [ 0.3422329  15.75232012  6.94940128  5.8598402  -4.3525394 ]
 [-1.28839014  6.94940128 13.06151953  1.58238781  0.94392314]
 [ 1.13288023  5.8598402   1.58238781  3.30834132 -1.33134132]
 [-0.47839144 -4.3525394   0.94392314 -1.33134132  3.52128471]]
矩阵mat的逆:
 [[ 1.80352376  0.91697099 -0.13003481 -1.89987257  0.69500392]
 [ 0.91697099  1.06125071 -0.33606314 -1.6733028   0.89378948]
 [-0.13003481 -0.33606314  0.21904487  0.39759582 -0.34145532]
 [-1.89987257 -1.6733028   0.39759582  3.24041446 -1.20785501]
 [ 0.69500392  0.89378948 -0.34145532 -1.20785501  1.11805164]]
矩阵mat的行列式的值:
105.54721777632038
矩阵mat的特征值和特征向量:
(array([23.58279263, 10.10645658,  2.29462217,  0.16661658,  1.1583058 ]), array([[-0.00179276, -0.18946636, -0.59452701, -0.46660531, -0.62683045],
       [ 0.77739059, -0.36419497,  0.09103298, -0.39431826,  0.31504284],
       [ 0.54092005,  0.77338945,  0.00371263,  0.10167527, -0.31451966],
       [ 0.27741393, -0.24680189, -0.58381349,  0.71576484,  0.09472503],
       [-0.16157864,  0.41523742, -0.54534269, -0.32270021,  0.63240505]]))
对矩阵mat做奇异值分解:
(array([[-0.00179276,  0.18946636,  0.59452701,  0.62683045,  0.46660531],
       [ 0.77739059,  0.36419497, -0.09103298, -0.31504284,  0.39431826],
       [ 0.54092005, -0.77338945, -0.00371263,  0.31451966, -0.10167527],
       [ 0.27741393,  0.24680189,  0.58381349, -0.09472503, -0.71576484],
       [-0.16157864, -0.41523742,  0.54534269, -0.63240505,  0.32270021]]), array([23.58279263, 10.10645658,  2.29462217,  1.1583058 ,  0.16661658]), array([[-0.00179276,  0.77739059,  0.54092005,  0.27741393, -0.16157864],
       [ 0.18946636,  0.36419497, -0.77338945,  0.24680189, -0.41523742],
       [ 0.59452701, -0.09103298, -0.00371263,  0.58381349,  0.54534269],
       [ 0.62683045, -0.31504284,  0.31451966, -0.09472503, -0.63240505],
       [ 0.46660531,  0.39431826, -0.10167527, -0.71576484,  0.32270021]]))

代码解释

X = numpy.random.randn(5,5)生成包含5行5列且服从标准正态分布的矩阵

X.T 指的是矩阵X的转置

mat = X.T.dot(X) X的转置与矩阵X相乘

inv(mat)矩阵mat的逆

det(mat)矩阵mat的行列式的值

eig(mat)矩阵mat的特征值和特征向量

svd(mat)对矩阵mat做奇异值分解 

你可能感兴趣的:(机器学习,python,机器学习)