当前位置: 首页 > news >正文

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数组表示矩阵和计算机行列式的值

  1. 虽然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)
  1. 二维数组并不能表示行列式,但可以用来计算行列式的值,如下。
# 计算行列式的值
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

  1. 对于每个样本点,预测值都是wxi + b,真实值都是yi。
  2. 最小二乘法就是要最小化预测值与真实值之间的误差平方和,找到使得误差平方和J(w,b)最小的w和b:
    在这里插入图片描述
  1. 找最佳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. 使用最小二乘法求解拟合数据的回归方程和使用机器学习求解回归方程有什么区别?

  1. 不同点:机器学习需要训练,使用最小二乘法求解拟合数据的回归方程不需要训练,直接求解即可。
  2. 相同点:机器学习求解回归方程时,底层也是调了最小二乘法。二者本质相同,求解出的w和b也完全相同。
  3. 虽然使用最小二乘法可以直接求解线性回归方程,但面对更复杂的数据或非线性方程时,无法直接求解得到w和b,更复杂的场景只有机器学习可以做到。
http://www.dtcms.com/a/108186.html

相关文章:

  • 【数据结构】图的基本概念
  • 基于Django框架的基金数据可视化平台(源码+lw+部署文档+讲解),源码可白嫖!
  • 客户机用vscode连接局域网内主机
  • springboot去读yml配置文件中的属性值
  • LLM大模型学习系列——总纲
  • 瑞数信息发布《BOTS自动化威胁报告》,揭示AI时代网络安全新挑战
  • 深入解析 Java 8 Function 接口:函数式编程的核心工具
  • react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析--react17
  • Windows下部署AgentGPT
  • C/C++与JavaScript的WebAssembly编程(一)
  • RNN模型及NLP应用(5/9)——多层RNN、双向RNN、预训练
  • js防抖函数防抖无效的解决方法
  • 14.网络套接字TCP
  • 5.好事多磨 -- TCP网络连接Ⅱ
  • LabVIEW多线程
  • API vs 网页抓取:获取数据的最佳方式
  • PyTorch中.pth文件的解析及应用
  • Linux的TCP连接数到达2万,其中tcp_tw、tcp_alloc、tcp_inuse都很高,可能出现什么问题
  • Python `async` 和 `asyncio` 区别; `asyncio.Lock` 和 `threading.Lock`区别
  • pyqt SQL Server 数据库查询-优化2
  • 使用ChromaDB构建RAG知识库
  • SSH远程连接服务器(cursor)
  • ssh私钥文件登录问题:Load key invalid format
  • spring-ai-alibaba第四章阿里dashscope集成百度翻译tool
  • 端到端机器学习流水线(MLflow跟踪实验)
  • Vue3+Vite+TypeScript+Element Plus开发-04.静态菜单设计
  • Java单例模式详解
  • 深入理解 CSS 选择器:从基础到高级的样式控制
  • iPhone 16怎么录制屏幕内容?屏幕录制技巧、软件分享
  • eBest AI智能报表:用自然语言对话解锁企业数据生产力