NumPy的应用
目录
- 一、导入numpy库
- 1. 常规语法
- 2. 导入numpy库
- 二、使用numpy创建数组和切片
- 三、使用numpy创建二维数组/矩阵和切片
- 四、使用numpy对数组/矩阵进行统计
- 五、使用numpy改变数组维度
- 1. reshape函数
- 2. resize函数
- 六、对numpy创建的数组排序
- 七、将numpy创建的数组转换为列表list
- 八、数组做运算
- 九、使用numpy数组表示向量
- 十、用numpy数组表示矩阵和计算机行列式的值
- 十一、根据月收入,使用最小二乘法预测网购支出
- 1. 先获取月收入x和网购支出y的数据
- 2. 现在要找到月收入和网购支出的关系
- 3. 现在要通过最小二乘法找到一个能拟合这些数据的一元线性方程 y=wx+b
- 4. 绘制散点+回归方程
- 5. 使用最小二乘法求解拟合数据的回归方程和使用机器学习求解回归方程有什么区别?
一、导入numpy库
1. 常规语法
from 库/模块 import 模块/类/函数 as 别名
import 库/库.模块 as 别名
库指的就是一个文件夹,模块指的就是库/文件夹里的每个py文件,每个模块/每个py文件下可以有多个类,也可以只有一个类。
2. 导入numpy库
import numpy as np
二、使用numpy创建数组和切片
# 使用numpy创建数组
import numpy as np
a1 = np.array([1, 2, 3])
# 使用numpy实现数组的切片
a2 = a1[:2]
print(a1)
print(a2)
# 布尔索引
a1 = np.arange(1, 10, 1)
print(a1) # [1 2 3 4 5 6 7 8 9]
a2 = a1[a1 > 5]
print(a2) # [6 7 8 9]
三、使用numpy创建二维数组/矩阵和切片
# 使用numpy创建矩阵
import numpy as np
a1 = np.array([[1, 2, 3], [4, 5, 6]])
# 使用numpy对矩阵切片
a2 = a1[:2, 1:]
print(a1)
print(a2)
四、使用numpy对数组/矩阵进行统计
# 使用numpy计算数组总和、均值、中位数
a1 = np.array([1, 3, 4, 2])
print(np.sum(a1))
print(np.mean(a1))
print(np.median(a1))
# 使用numpy计算方差,标准差,极值
print(np.var(a1))
print(np.std(a1))
print(np.amax(a1))
五、使用numpy改变数组维度
1. reshape函数
import numpy as np
a1 = np.arange(1, 9)
print(a1)
print(a1.shape)
# 将a1变换为二维数组/矩阵
a2 = np.reshape(a1, (2, 4))
print(a2)
print(a2.shape)
# 将a1变为三维数组/张量
a3 = np.reshape(a1, (2, 2, 2))
print(a3)
print(a3.shape)
# 将a2变为一维数组/向量
a4 = np.reshape(a2, 8)
print(a4)
print(a4.shape)
输出:
[1 2 3 4 5 6 7 8]
(8,)
[[1 2 3 4]
[5 6 7 8]]
(2, 4)
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
(2, 2, 2)
[1 2 3 4 5 6 7 8]
(8,)
2. resize函数
和reshape的区别:resize可以放大/缩小原数组的形状,reshape变换维度后元素个数不匹配会报错。
a1 = np.arange(1, 9)
a2 = np.resize(a1, (2, 4))
print(a2)
# 放大时,缺少的元素复用原数组中的元素
a3 = np.resize(a1, (2, 6))
print(a3)
# 缩小时,直接丢弃多余元素。
a4 = np.resize(a1, (2, 3))
print(a4)
输出:
[[1 2 3 4]
[5 6 7 8]]
[[1 2 3 4 5 6]
[7 8 1 2 3 4]]
[[1 2 3]
[4 5 6]]
六、对numpy创建的数组排序
a1 = np.array([2, 4, 1, 3])
a1.sort()
print(a1) # [1 2 3 4]
七、将numpy创建的数组转换为列表list
a1 = np.array([2, 4, 1, 3])
a2 = a1.tolist()
print(a2) # [1, 2, 3, 4]
八、数组做运算
# numpy数组和标量做运算
a1 = np.arange(1, 10)
print(a1 + 10)
# 数组和数组做运算,要求两个数组的shape一致
a2 = np.array([1, 1, 1, 2, 2, 2, 3, 3, 3])
a3 = a1 + a2 # np.add(a1, a2)也可以
print(a3)
# 数组每个元素开根号
a4 = np.sqrt(a1)
print(a4)
九、使用numpy数组表示向量
# numpy数组可以用来表示n维向量
# 用户有一个3维向量,不同维度代表对不同类型电影的喜爱程度
u = np.array([5, 1, 3])
# 有两部电影,每部电影都有一个3维向量
m1 = np.array([4, 5, 1])
m2 = np.array([5, 1, 5])
# 我们要推荐更接近用户喜好的电影
# 用户向量与电影向量的夹角处于0-180度范围内
# 夹角越小,向量越相似,余弦值/余弦相似度越大;夹角越大,向量越不相似,余弦值/余弦相似度越小
cosu_m1 = np.dot(u, m1) / (np.linalg.norm(u) * np.linalg.norm(m1))
cosu_m2 = np.dot(u, m2) / (np.linalg.norm(u) * np.linalg.norm(m2))
print(f'第一个{cosu_m1}, 第二个{cosu_m2}') # 第一个0.7302967433402215, 第二个0.9704311900788593
if cosu_m1 > cosu_m2:
print(f'给用户推荐第1部电影,用户和电影1的余弦相似度为{cosu_m1}')
else:
print(f'给用户推荐第2部电影,用户和电影2的余弦相似度为{cosu_m2}') # 给用户推荐第2部电影,用户和电影2的余弦相似度为0.9704311900788593
十、用numpy数组表示矩阵和计算机行列式的值
- 虽然python中有专门的matrix模块表示矩阵,但官方并不推荐使用。因此,我们还是使用二维数组来表示矩阵:
# 用二维数组表示矩阵A
A = np.array([[1, 2, 1], [3, 7, 2], [2, 2, 1]])
# 把一维数组变成列向量b(依旧是用二维数组表示一个矩阵/列向量)
b = np.array([8, 23, 9]).reshape(-1, 1) # 数组可以直接调reshape,等同于 np.reshape(b, (-1, 1))
print(b)
输出:
[[ 8]
[23]
[ 9]]
# 求矩阵的秩
z = np.linalg.matrix_rank(m1)
print(z)
- 二维数组并不能表示行列式,但可以用来计算行列式的值,如下。
# 计算行列式的值
m1 = np.array([[1, 3, 5], [2, 4, 6], [4, 7, 9]])
val = np.linalg.det(m1)
print(val)
十一、根据月收入,使用最小二乘法预测网购支出
1. 先获取月收入x和网购支出y的数据
# x是月收入
x = np.array([
25000, 15850, 15500, 20500, 22000, 20010, 26050, 12500, 18500, 27300,
15000, 8300, 23320, 5250, 5800, 9100, 4800, 16000, 28500, 32000,
31300, 10800, 6750, 6020, 13300, 30020, 3200, 17300, 8835, 3500
])
# y是网购支出
y = np.array([
2599, 1400, 1120, 2560, 1900, 1200, 2320, 800, 1650, 2200,
980, 580, 1885, 600, 400, 800, 420, 1380, 1980, 3999,
3800, 725, 520, 420, 1200, 4020, 350, 1500, 560, 500
])
2. 现在要找到月收入和网购支出的关系
# 先绘制一张散点图
import matplotlib.pyplot as plt
plt.scatter(x, y, color='blue')
plt.show()
可以发现月收入x和网购支出y是正相关的。
3. 现在要通过最小二乘法找到一个能拟合这些数据的一元线性方程 y=wx+b
- 对于每个样本点,预测值都是wxi + b,真实值都是yi。
- 最小二乘法就是要最小化预测值与真实值之间的误差平方和,找到使得误差平方和J(w,b)最小的w和b:
- 找最佳w和b的过程:分别对w和b求偏导,并让式子分别等于0,得到如下式子,再把xi和yi都代入即可:
代码:
from numpy.polynomial import Polynomial
res = Polynomial.fit(x, y, deg=1).convert().coef # deg=1说明回归模型y=wx+b最高次项就是1次项
w, b = res[1], res[0] # res的值是[-2.94883437e+02 1.10333716e-01], 前者是截距b, 后者是系数w
print(w, b) # 0.11033371646026191 -294.8834372455533
4. 绘制散点+回归方程
# 先把原数据的散点图画出来
plt.scatter(x, y, color='blue')
# 再把方程绘制出来
y = w * x + b
plt.scatter(x, y, color='green')
plt.plot(x, y, color='red')
5. 使用最小二乘法求解拟合数据的回归方程和使用机器学习求解回归方程有什么区别?
- 不同点:机器学习需要训练,使用最小二乘法求解拟合数据的回归方程不需要训练,直接求解即可。
- 相同点:机器学习求解回归方程时,底层也是调了最小二乘法。二者本质相同,求解出的w和b也完全相同。
- 虽然使用最小二乘法可以直接求解线性回归方程,但面对更复杂的数据或非线性方程时,无法直接求解得到w和b,更复杂的场景只有机器学习可以做到。