人工智能教程(三):更多有用的 Python 库
- 转载
- 2024-12-22
- 25热度
- 0评论
文章目录[隐藏]
人工神经网络 (通常简称为 神经网络 ,NN)是机器学习和深度学习的核心。顾名思义,它是受人脑的生物神经网络启发而设计的计算模型。本文中我没有插入神经网络模型的图片,因为在互联网上很容易找到它们。我相信任何对人工智能感兴趣的人应该都见过它们,左边是输入层,中间是一个或多个隐藏层,右边是输出层。各层之间的边上的 权重
监 督 学 习 和 无监督学习
在实际的机器学习应用中会发生这样的情况吗?是的!训练模型用的数据集可能是不充分的或者不完整的。这是两种模型都仍然在人工智能和机器学习领域蓬勃发展的众多原因之一。在后续文章中,我们将更正式地讨论它们。下面我们开始学习使用 JupyterLab,它是一个用于开发人工智能程序的强大工具。
在本系列的前几篇文章中,为了简单起见,我们一直使用 Linux 终端运行 Python 代码。现在要介绍另一个强大的人工智能工具——JupyterLab。在本系列的第一篇文章中,我们对比了几个候选项,最终决定使用 JupyterLab。它比 Jupyter Notebook 功能更强大,为我们预装了许多库和包,并且易于团队协作。还有一些其它原因,我们将在后续适时探讨它们。
jupyter lab
或 jupyter-lab
命令在会默认浏览器(如 Mozilla Firefox、谷歌 Chrome 等)中打开 JupyterLab。(LCTT 译注:没有安装 JupyterLab 也不要紧,你可以先 )图 1 是在浏览器中打开的 JupyterLab 启动器的局部截图。JupyterLab 使用一个名为 IPython(交互式 Python)的 Python 控制台。注意,IPython 其实可以独立使用,在 Linux 终端运行 ipython
命令就可以启动它。
.ipynb
在图 2 处可以看到有三个选项,它们表示 Jupyter Notebook 中可以使用的三种类型的单元。“Code”(绿色框) 表示代码单元,它是用来执行代码的。“Markdown” 单元可用于输入说明性的文本。如果你是一名计算机培训师,可以用代码单元和 Markdown 单元来创建交互式代码和解释性文本,然后分享给你的学员。“Raw”(红色框)表示原始数据单元,其中的内容不会被格式化或转换。
和在终端中不同,在 Jupyter Notebook 中你可以编辑并重新运行代码,这在处理简单的拼写错误时特别方便。图 3 是在 Jupyter Notebook 中执行 Python 代码的截图。
要在执行代码单元中的代码,先选中该单元格,然后点击蓝框标记的按钮。图 3 中用红框标记的是 Markdown 单元,用绿框标记的是代码单元,用黄框标记的执行代码的输出。在这个例子中,Python 代码输出的是 π 的值。
import
命令将这些库导入到代码中。使用 !pip freeze
命令可以列出 JupyterLab 中目前可用的所有库和包。如果有库或包没有安装,大多数情况下都可以通过 pip install <全小写的库或者包的名称>
来安装它们。例如安装 TensorFlow 的命令是 pip install tensorflow
复杂的矩阵运算
通过下面的代码,我们来了解一些更复杂的矩阵运算或操作。为了节省空间,我没有展示代码的输出。
import numpy as np
A = np.arr ay([[1,2,3],[4,5,6],[7,8,88]])
B = np.arr ay([[1,2,3],[4,5,6],[4,5,6]])
print(A.T)
print(A.T.T)
print(np.trace(A))
print(np.linalg.det(A))
C = np.linalg.inv(A)
print(C)
print(A@C)
下面我逐行来解释这些代码:
-
-
创建矩阵
A
。 -
创建矩阵
B
。 -
打印矩阵
A
的转置 。通过比较矩阵A
与A
的转置,你用该可以大致理解转置操作到底做了什么。 -
打印
A
的转置的转置。可以看到它和矩阵A
是相同的。这又提示了转置操作的含义。 -
打印矩阵
A
的 迹 。迹是矩阵的对角线(也称为主对角线)元素的和。矩阵A
的主对角线元素是 1、5 和 88,所以输出的值是 94。 -
打印
A
的行列式 。当执行代码的结果是 -237.00000000000009(在你的电脑中可能略有区别)。因为行列式不为 0,所以称 A 为非奇异矩阵 。 -
将矩阵
A
的逆 保存到矩阵C
中。 -
打印矩阵
C
。 -
打印矩阵
A
和C
的乘积。仔细观察,你会看到乘积是一个单位矩阵 ,也就是一个所有对角线元素都为 1,所有其它元素都为 0 的矩阵。请注意,输出中打印出的不是精确的 1 和 0。在我得到的答案中,有像 -3.81639165e-17 这样的数字。这是浮点数的科学记数法,表示 -3.81639165 × 10 -17
根据第一篇文章中的惯例,可以将代码分成基本 Python 代码和人工智能代码。在这个例子中,除了第 1 行和第 9 行之外的所有代码行都可以被看作是人工智能代码。
B
的行列式为 0,因此它被称为奇异矩阵
方阵就是行数和列数相等的矩阵。在上面的例子中我只是展示了对矩阵执行各种操作,并没有解释它们背后的理论。如果你不知道或忘记了矩阵的转置、逆、行列式等知识的话,你最好自己学习它们。同时你也应该了解一下不同类型的矩阵,比如单位矩阵、对角矩阵、三角矩阵、对称矩阵、斜对称矩阵。维基百科上的相关文章是不错的入门。
矩阵分解,它是更复杂的矩阵操作。矩阵分解与整数的因子分解类似,就是把一个矩阵被写成其它矩阵的乘积。下面我通过图 4 中整数分解的例子来解释矩阵分解的必要性。代码单元开头的 %time
是 Jupyter Notebook 的魔法命令 ,它会打印代码运行所花费的时间。**
是 Python 的幂运算符。基本的代数知识告诉我们,变量 a 和 b 的值都等于 (6869 x 7873) 100
在几乎所有的矩阵分解技术技术中,原始矩阵都会被写成更稀疏的矩阵的乘积。稀疏矩阵 密集矩阵 。在本文中将介绍三种矩阵分解技术——LUP 分解、特征分解和奇异值分解(SVD)。
为了执行矩阵分解,我们需要另一个强大的 Python 库,SciPy。SciPy 是基于 NumPy 库的科学计算库,它提供了线性代数、积分、微分、优化等方面的函数。首先,让我们讨论 LUP 分解。任何方阵都能进行 LUP 分解。LUP 分解有一种变体,称为 LU 分解。但并不是所有方阵都能 LU 分解。因此这里我们只讨论 LUP 分解。
下三角矩阵 ,它是主对角线以上的所有元素都为零的方阵。U 是一个上三角矩阵 ,它是主对角线以下所有元素为零的方阵。P 是一个排列矩阵
现在看下面的 LUP 分解的代码。
import numpy as np
import scipy as sp
A=np.array([[11,22,33],[44,55,66],[77,88,888]])
P, L, U = sp.linalg.lu(A)
print(P)
print(L)
print(U)
print(P@L@U)
A
。请记住,我们在本节中会一直使用矩阵 A
。第 4 行将矩阵 A
分解为三个矩阵——P
、L
和 U
。第 5 行到第 7 行打印矩阵 P
、L
和 U
。从图 5 中可以清楚地看出,P
是一个置换矩阵,L
是一个下三角矩阵,U
是一个上三角矩阵。最后在第 8 行将这三个矩阵相乘并打印乘积矩阵。从图 5 可以看到乘积矩阵 P@L@U
等于原始矩阵 A
,满足矩阵分解的性质。此外,图 5 也验证了矩阵 L
、U
和 P
比矩阵 A
特征值 和特征向量
Lambda, Q = np.linalg.eig(A)
。这也告诉我们 NumPy 和 SciPy 的功能之间有一些重叠。第 4 行重建了原始矩阵 A。第 4 行中的代码片段 np.diag(Lambda)
是将特征值转换为对角矩阵(记为 Λ
)。对角矩阵是主对角线以外的所有元素都为 0 的矩阵。第 4 行的代码片段 sp.linalg.inv(Q)
是求 Q
的逆矩阵(记为 Q -1)。最后,将三个矩阵 Q
、Λ
、Q
-1 相乘得到原始矩阵 A
。也就是在特征分解中 A=QΛQ
-1
图 6 还显示了执行的代码的输出。红框标记的是特征值,用绿框标记的是特征向量,重构的矩阵 A 用蓝框标记。你可能会感到奇怪,输出中像 11.+0.j 这样的数字是什么呢?其中的 j 是虚数单位。11.+0.j 其实就是 11.0+0.0j,即整数 11 的复数形式。
A
分解为三个矩阵 U
、S
和 V
。第 2 行中的代码片段 np.diag(S)
将 S
转换为对角矩阵。最后,将这三个矩阵相乘重建原始矩阵 A
计算机视觉 是人工智能和机器学习技术被应用得最广泛的领域之一。下面我将介绍两个计算机视觉相关的库:OpenCV 和 Matplotlib。OpenCV 是一个主要用于实时计算机视觉的库,它由 C 和 C++ 开发。C++ 是 OpenCV 的主要接口,它通过 OpenCV-Python 向用户提供 Python 接口。Matplotlib 是基于 Python 的绘图库。我曾在 OSFY 上的一篇早期
pip install matplotlib
OSFY-Logo.jpg
的图像。我从 OSFY 门户网站的首页下载了这张图片。此图像高 80 像素,宽 270 像素。第 4 行和第 5 行在 Jupyter Notebook 窗口中显示图像。请注意图像下方用红框标记的两行代码,它的输出告诉我们变量 image
实际上是一个 NumPy 数组。具体来说,它是一个 80 x 270 x 3 的三维数组。
(255,255,255)
print(image)
randint
实现的。实际上,我中彩票的几率都比这两个矩阵完全相等的几率大得多。
接下来我们要生成一个形状为 512 x 512 x 3 的三维数组,然后将它转换为图像。为此我们将用到 OpenCV。注意,安装 OpenCV 命令是 pip install opencv-python
import cv2
img = np.random.randint(0, 256, size=(512, 512, 3))
cv2.imwrite('img.jpg', img)
第 1 行导入库 OpenCV。注意导入语句是 import cv2
,这与大多数其他包的导入不同。第 3 行将矩阵 img 转换为名为 img.jpg
image.jpg
输出图像会是什么样子?我给你两个提示。函数 zeros
在第 4 行和第 5 行创建了两个 512 x 512 的数组,其中绿色和蓝色填充了零。第 7 行到第 9 行用来自数组 red
、green
和 blue
的值填充三维数组 img1
import numpy as np
import cv2
red = np.random.randint(0, 256, size=(512, 512))
green = np.zeros([512, 512], dtype=np.uint8)
blue = np.zeros([512, 512], dtype=np.uint8)
img1 = np.zeros([512,512,3], dtype=np.uint8)
img1[:,:,0] = blue
img1[:,:,1] = green
img1[:,:,2] = red
cv2.imwrite(‘image.jpg’, img1)
张量
作者: 选题: 译者: 校对:
本文由 原创编译, 荣誉推出