慕课网机器学习笔记(2)

内容提要


矩阵运算

  • 对一个矩阵的每个数据乘2
1
2
3
4
5
6
7
import numpy as np
n = 10
L = np.arange(n)
np.array([2*e for e in L])
# array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
L*2
# array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
  • 对矩阵进行加减乘除等基本运算

+, -, *, /, //, %

np.abs, np.sin, np.cos, np.tan, np.exp, np.log, np.power(n**M)

  • 矩阵间的乘法
1
2
3
4
5
6
7
8
9
10
11
12
M1 = np.arange(start=1, stop=10).reshape([3,3])
M2 = np.arange(6).reshape([3,2])
M1.dot(M2)
# array([[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]])
# array([[0, 1],
# [2, 3],
# [4, 5]])
# array([[16, 22],
# [34, 49],
# [52, 76]])
  • 矩阵的反转
1
2
3
4
5
6
7
M2 = np.arange(6).reshape([3,2])
M2.T
# array([[0, 1],
# [2, 3],
# [4, 5]])
# array([[0, 2, 4],
# [1, 3, 5]])
  • 向量堆叠
1
2
3
4
A1 = np.arange(2)
np.tile(A1, (2,1))
# array([[0, 1],
# [0, 1]])
  • 矩阵的逆
1
2
3
4
5
M1 = np.arange(start=1, stop=10).reshape([3,3])
np.linalg.inv(M1)
# array([[ 3.15251974e+15, -6.30503948e+15, 3.15251974e+15],
# [-6.30503948e+15, 1.26100790e+16, -6.30503948e+15],
# [ 3.15251974e+15, -6.30503948e+15, 3.15251974e+15]])
  • 矩阵的伪逆(原矩阵与逆矩阵相乘为单位矩阵)
1
2
3
4
5
6
7
M1 = np.arange(start=0, stop=10).reshape([2,5])
np.linalg.pinv(M1)
array([[-3.20000000e-01, 1.20000000e-01],
[-1.80000000e-01, 8.00000000e-02],
[-4.00000000e-02, 4.00000000e-02],
[ 1.00000000e-01, -1.38777878e-17],
[ 2.40000000e-01, -4.00000000e-02]])

聚合操作

  • 一维求和
1
2
3
big_array = np.random.rand(1000000)
%timeit sum(big_array) # 81.3 ms ± 1.23 ms per loop
%timeit np.sum(big_array) # 382 µs ± 5.38 µs per loop
  • 二维沿行求和,沿列求和
1
2
3
4
5
6
7
M = np.arange(6).reshape([2,3])
# array([[0, 1, 2],
# [3, 4, 5]])
np.sum(M, axis=0)
# array([3, 5, 7])
np.sum(M, axis=1)
# array([ 3, 12])
  • 乘积
1
2
3
M = np.arange(6).reshape([2,3])
np.prod(M+1)
# 720
  • 均值,中位数

mean, median

  • 百分位点
1
2
3
4
5
6
7
8
big_array = np.random.rand(10000000)
for precent in [0, 25, 50, 75, 100]:
print(np.percentile(big_array, q=precent))
# 2.8120511030849116e-08
# 0.2497396828047649
# 0.49990547450366424
# 0.7499534919847901
# 0.9999999687386607
  • 打乱顺序

np.random.shuffle


索引

  • 最大最小值的索引

argmin, argmax

  • 排序索引
1
2
3
4
5
6
7
arr = np.arange(10)
np.random.shuffle(arr)
# array([2, 4, 9, 6, 7, 8, 3, 0, 5, 1])
np.sort(arr)
np.argsort(arr)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# array([7, 9, 0, 6, 1, 8, 3, 4, 5, 2])
  • 根据指定坐标访问矩阵(例:访问第0,2行的第1个元素)
1
2
3
4
5
6
MM = np.arange(12).reshape([3,4])
MM[[0,2], [1]]
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
# array([1, 9])
1
2
3
4
MM[:MM.shape[0], [1]]
# array([[1],
# [5],
# [9]])
  • 根据布尔值访问矩阵(例:访问第0,2行的第1个元素)
1
2
3
4
5
6
7
8
MM = np.arange(12).reshape([3,4])
row = [True, False, True]
col = [False, True, False, False]
MM[row, col]
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
# array([1, 9])

矩阵大小判断

  • 比较运算符都是支持的,返回的是布尔矩阵

  • 与和或运算 all, any

  • 统计非0元素 count_nonzero

  • 多个逻辑相叠加

1
2
3
4
arr = np.arange(12)
np.sum((arr > 5) & ~(arr % 2 == 0))
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
# 3

numpy综合小实战

取出矩阵中的一些行,满足每一行最后一列的元素值能被3整除

1
2
3
4
5
6
7
8
9
10
11
XX = np.arange(16).reshape((4,4))
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15]])

# 我的解法
XX[(XX[:XX.shape[0], [-1]] % 3 == 0)[:, 0], :XX.shape[1]]

# 老师的解法
XX[XX[:, 3] % 3 == 0, :]

注:表格数据处理类库 Pandas


绘制折线图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt
import numpy as np
X = np.linspace(0, 10, 100)
Y = np.sin(X)
Y2 = np.cos(X)
plt.plot(X, Y, color="red", linestyle="--", label="sin(x)")
plt.plot(X, Y2, linestyle="-.", label="cos(x)")
plt.xlim(-5, 15)
plt.ylim(0, 1.5)
plt.xlabel("X axis")
plt.ylabel("Y value")
# 添加plot中的label
plt.legend()
plt.title("Welcome to ML world")
plt.show()


绘制散点图

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
import numpy as np
# 绘制正态分布
xx = np.random.normal(0, 10, 100000)
yy = np.random.normal(0, 10, 100000)
# 设置透明度
plt.scatter(xx, yy, alpha=0.5)
plt.show()


对鸢尾花的数据进行绘制

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:, :2]
y=iris.target
plt.scatter(X[y==0, 0], X[y==0, 1], color="red", marker="o")
plt.scatter(X[y==1, 0], X[y==1, 1], color="green", marker="+")
plt.scatter(X[y==2, 0], X[y==2, 1], color="black", marker="*")