使用 NumPy 范数计算向量和矩阵范数

2023-10-24

在线性代数中,范数是为向量空间中的每个向量分配严格正的长度或大小的函数。它是矢量大小的度量。

从数学上来说,对于一个向量x, the p-范数定义为||x||p = (sum |xi|^p)^(1/p).

在本教程中,我们将使用numpy.linalg.norm()function,这是Python中用于计算范数的关键函数。

 

 

numpy.linalg.norm() 的语法和参数

用于计算范数的函数NumPy is numpy.linalg.norm()。这是它的语法:


numpy.linalg.norm(x, ord=None, axis=None, keepdims=False)
  

参数如下:

  • x:输入数组。它可以是向量或矩阵。
  • ord: 正常顺序。它可以是任何正数、np.inf、-np.inf、0、1 或 2.
  • axis:计算范数所沿的一个或多个轴。如果这是一个整数元组,则在多个维度上计算范数。
  • keepdims:如果设置为 True,则标准化的轴将作为尺寸为 1 的维度保留在结果中。

下面是它的使用示例:


import numpy as np

# Define a vector
vector = np.array([1, -2, 3, -4, 5])

# Compute L1 norm
l1_norm = np.linalg.norm(vector, ord=1)

print("L1 Norm: ", l1_norm)  

Output:


L1 Norm: 15.0  

在上面的代码中,我们定义了一个向量并使用以下方法计算其 L1 范数numpy.linalg.norm()。我们传递向量并且ord=1计算L1范数,结果为15.0.

 

标准化与采用规范

标准化对数据进行缩放,使其落在特定范围内,通常在 0 到 1 之间。

取向量的范数可以计算向量空间中向量的大小或长度。
下面是一个例子来说明差异:


import numpy as np
vector = np.array([1, 2, 3, 4, 5])

# Normalize the vector
normalized_vector = vector / np.linalg.norm(vector)

# Compute the l2 norm (Euclidean distance)
l2_norm = np.linalg.norm(vector)

print("Normalized Vector: ", normalized_vector)
print("L2 Norm: ", l2_norm)
  

Output:


Normalized Vector:  [0.13483997 0.26967994 0.40451992 0.53935989 0.67419986]
L2 Norm:  7.416198487095663
  

在此代码中,我们首先定义一个向量,然后通过将向量中的每个元素除以向量的 L2 范数来对其进行归一化。

我们还计算原始向量的 L2 范数。正如我们所看到的,归一化向量的数据在 0 和 1 之间重新缩放,而 L2 范数输出表示原始向量的长度或大小的单个数字。

 

向量范数的类型

有不同类型的向量范数,包括:

  1. L1范数:也称为曼哈顿距离,它是向量中元素的绝对值之和。
  2. L2范数:也称为欧氏距离,它是向量中每个元素的平方和的平方根。
  3. 无穷范数:该范数给出向量元素之间的最大绝对值。
  4. 负无穷范数:该范数给出向量元素中的最小绝对值。

让我们计算一下这些规范的每种类型。

 

L1范数(曼哈顿距离)

L1 范数也称为曼哈顿距离,计算为向量中元素的绝对值之和。

当绝对值的差异更重要时,它特别有用。以下是计算 L1 范数的方法:


import numpy as np
vector = np.array([1, -2, 3, -4, 5])

# Compute L1 norm
l1_norm = np.linalg.norm(vector, ord=1)
print("L1 Norm: ", l1_norm)
  

Output:


L1 Norm:  15.0
  

在上面的代码中,我们首先定义一个向量。然后我们使用以下方法计算向量的 L1 范数np.linalg.norm() with ord=1。结果是15.0,它是向量中元素的绝对值之和。

 

L2范数(欧几里得距离)

L2范数,也称为欧几里得距离,是向量中元素的平方和的平方根。

它通常用于测量空间中点之间的距离。以下是计算 L2 范数的方法:


import numpy as np
vector = np.array([1, -2, 3, -4, 5])

# Compute L2 norm
l2_norm = np.linalg.norm(vector, ord=2)
print("L2 Norm: ", l2_norm)
  

Output:


L2 Norm:  7.416198487095663
  

在上面的代码中,我们首先定义一个向量。然后我们使用以下方法计算向量的 L2 范数np.linalg.norm() with ord=2.

结果是7.416198487095663,它是向量中元素的平方和的平方根。

 

无穷范数(最大范数)

无穷范数,也称为最大范数,返回向量元素中的最大绝对值。

以下是计算无穷范数的方法:


import numpy as np
vector = np.array([1, -2, 3, -4, 5])

# Compute Infinity norm
infinity_norm = np.linalg.norm(vector, ord=np.inf)
print("Infinity Norm: ", infinity_norm)
  

Output:


Infinity Norm:  5.0
  

在上面的代码中,我们首先定义一个向量。然后我们使用以下方法计算向量的无穷范数np.linalg.norm() with ord=np.inf.

结果是5.0,它是向量元素中的最大绝对值。

 

负无穷范数(最小范数)

负无穷范数,也称为最小范数,返回向量元素中的最小绝对值。

以下是计算负无穷范数的方法:


import numpy as np
vector = np.array([1, -2, 3, -4, 5])

# Compute Negative Infinity norm
negative_infinity_norm = np.linalg.norm(vector, ord=-np.inf)
print("Negative Infinity Norm: ", negative_infinity_norm)
  

Output:


Negative Infinity Norm:  1.0
  

在上面的代码中,我们首先定义一个向量。然后我们使用以下方法计算向量的负无穷范数np.linalg.norm() with ord=-np.inf.

结果是1.0,它是向量元素中的最小绝对值。

 

计算其他 p 范数

除了 L1、L2、无穷大和负无穷范数之外,您还可以计算任何其他范数p-规范使用numpy.linalg.norm().

The p-范数定义为(sum |x_i|^p)^(1/p).
这是一个计算向量 3-范数的示例:


import numpy as np
vector = np.array([1, -2, 3, -4, 5])

# Compute 3-norm
p3_norm = np.linalg.norm(vector, ord=3)
print("3-Norm: ", p3_norm)
  

Output:


3-Norm:  6.082201995573399
  

在上面的代码中,我们首先定义一个向量。然后我们使用以下方法计算向量的 3-范数np.linalg.norm() with ord=3.

结果是6.082201995573399,它是向量中元素绝对值的立方和的立方根。

 

矩阵范数解释

矩阵范数是向量范数的扩展。对于矩阵,我们有几种类型的范数。最流行的是:

  1. Frobenius Norm:其元素绝对平方和的平方根,类似于向量的 L2 范数。
  2. 谱范数(2-范数):矩阵的最大奇异值(即矩阵厄米特最大特征值的平方根)。
  3. 1-范数:矩阵的最大绝对列和。
  4. ∞-范数:矩阵的最大绝对行和。

矩阵范数可以使用相同的方法计算numpy.linalg.norm()函数作为向量范数,但我们必须输入一个二维数组而不是一维数组。

让我们在下一节中计算这些矩阵范数。

 

弗罗贝尼乌斯范数

以下是计算 Frobenius 范数的方法:


import numpy as np
matrix = np.array([[1, -2, 3], [-4, 5, -6], [7, -8, 9]])

# Compute Frobenius norm
frobenius_norm = np.linalg.norm(matrix, ord='fro')
print("Frobenius Norm: ", frobenius_norm)
  

Output:


Frobenius Norm:  16.881943016134134
  

在上面的代码中,我们首先定义一个矩阵。然后我们使用以下方法计算矩阵的 Frobenius 范数np.linalg.norm() with ord='fro'.

结果是16.881943016134134,它是矩阵中元素的平方和的平方根。

 

谱范数(最大奇异值)

以下是计算谱范数的方法:


import numpy as np

# Define a matrix
matrix = np.array([[1, -2, 3], [-4, 5, -6], [7, -8, 9]])

# Compute Spectral norm
spectral_norm = np.linalg.norm(matrix, ord=2)

print("Spectral Norm: ", spectral_norm)
  

Output:


Spectral Norm:  16.84810335261421
  

在上面的代码中,我们首先定义一个矩阵。然后我们使用计算矩阵的谱范数np.linalg.norm() with ord=2.

结果是16.84810335261421,这是矩阵的最大奇异值。

 

计算其他归纳范数(1-范数、∞-范数)

以下是计算 1-范数和 Infini-范数的方法:


import numpy as np
matrix = np.array([[1, -2, 3], [-4, 5, -6], [7, -8, 9]])

# Compute 1-Norm
one_norm = np.linalg.norm(matrix, ord=1)

# Compute ∞-Norm
inf_norm = np.linalg.norm(matrix, ord=np.inf)

print("1-Norm: ", one_norm)
print("∞-Norm: ", inf_norm)  

Output:


1-Norm: 18.0
∞-Norm: 24.0  

在上面的代码中,我们首先定义一个矩阵。然后我们使用以下方法计算矩阵的 1-范数和 Infini-范数np.linalg.norm() with ord=1 and ord=np.inf分别。

1-范数结果是18.0,这是矩阵的最大绝对列和。

∞-范数结果是24.0,这是矩阵的最大绝对行和。

 

性能比较

为了比较性能,我们计算一个大向量的 L1 范数和 L2 范数并测量计算时间:


import numpy as np
import time

# Create a large vector
vector = np.random.rand(1000000)

# Compute L1 norm and measure time
start_time = time.time()
l1_norm = np.linalg.norm(vector, ord=1)
end_time = time.time()

print("L1 norm: ", l1_norm)
print("Time for L1 norm: %s seconds" % (end_time - start_time))

# Compute L2 norm and measure time
start_time = time.time()
l2_norm = np.linalg.norm(vector, ord=2)
end_time = time.time()

print("L2 norm: ", l2_norm)
print("Time for L2 norm: %s seconds" % (end_time - start_time))
  

注意:每次运行时,确切的输出都会有所不同,因为我们正在创建一个随机向量:


L1 norm: 500205.0234115845
Time for L1 norm: 0.006276130676269531 seconds
L2 norm: 577.4774120713894
Time for L2 norm: 0.00099945068359375 seconds
  

在这种情况下,计算 L2 范数比计算 L1 范数更快。

 

使用 numpy.linalg.norm() 时的常见错误

误认为默认标准: 默认情况下,numpy.linalg.norm()计算矩阵的 Frobenius 范数和向量的 2-范数(欧几里得距离)。

始终指定ord如果您想要不同的规范,请使用参数。


# Wrong usage for L1 norm
vector = np.array([1, -2, 3, -4, 5])
wrong_l1_norm = np.linalg.norm(vector) # This computes L2 norm, not L1
print("Wrong L1 Norm: ", wrong_l1_norm)

# Correct usage for L1 norm
correct_l1_norm = np.linalg.norm(vector, ord=1)
print("Correct L1 Norm: ", correct_l1_norm)
  

Output:


Wrong L1 Norm:  7.416198487095663
Correct L1 Norm:  15.0
  

将矩阵范数误认为向量范数:如果您正在处理矩阵,请确保使用矩阵范数。

例如,使用ord=1使用矩阵将计算最大绝对列和,而不是所有元素的绝对值之和。


# Wrong usage for matrix
matrix = np.array([[1, -2, 3], [-4, 5, -6], [7, -8, 9]])
wrong_l1_norm = np.linalg.norm(matrix, ord=1) # This computes max column sum, not sum of absolute values
print("Wrong L1 Norm: ", wrong_l1_norm)

# Correct usage for matrix
correct_fro_norm = np.linalg.norm(matrix, ord='fro') # Frobenius norm gives the square root of sum of squares of all elements
print("Correct Frobenius Norm: ", correct_fro_norm)
  

Output:


Wrong L1 Norm:  18.0
Correct Frobenius Norm:  16.881943016134134
  

不考虑负无穷范数:负无穷范数返回数组中的最小绝对值,而不是最小值本身。

这意味着在选择最小的数之前,负数将变为正数。


vector = np.array([1, -2, 3, -4, 5])
neg_inf_norm = np.linalg.norm(vector, ord=-np.inf)
print("Negative Infinity Norm: ", neg_inf_norm)
  

Output:


Negative Infinity Norm:  1.0
  

 

numpy.linalg.norm() 的实际应用

规范在各种现实应用中发挥着不可或缺的作用,特别是在机器学习和数据科学中。

这是我们如何使用 L2 范数的示例自然语言处理(NLP) 用于文本向量标准化。

在此示例中,我们将使用TfidfVectorizer from sklearn,它将文本转换为可用作机器学习模型输入的特征向量。


from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np

# Sample corpus
corpus = [
    'This is the first document.',
    'This document is the second document.',
    'And this is the third one.',
    'Is this the first document?',
]

vectorizer = TfidfVectorizer()

# Fit and transform the corpus
X = vectorizer.fit_transform(corpus)

# Get the first document's vector
first_vector = X[0].toarray()

# Before normalization
print("Before normalization: ", first_vector)

# Compute L2 norm
l2_norm = np.linalg.norm(first_vector, ord=2)

# After normalization
normalized_vector = first_vector / l2_norm
print("After normalization: ", normalized_vector)
  

Output:


Before normalization:  [[0.         0.46979139 0.58028582 0.38408524 0.         0.
  0.38408524 0.         0.38408524]]
After normalization:  [[0.         0.46979139 0.58028582 0.38408524 0.         0.
  0.38408524 0.         0.38408524]]  

 

在上面的代码中,我们首先定义了四个文档的语料库。然后我们初始化一个TfidfVectorizer,它将原始文档集合转换为 TF-IDF 特征矩阵。

我们使用矢量化器来拟合和转换我们的语料库。然后我们选择第一个文档的向量。
在标准化之前,向量的值的范围可能很大,具体取决于文档的长度和每个单词的频率。

在计算向量的 L2 范数并通过将向量除以 L2 范数来标准化向量后,所得向量的长度(或大小)为 1。

 

进一步阅读

https://numpy.org/doc/stable/reference/ generated/numpy.linalg.norm.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NumPy 范数计算向量和矩阵范数 的相关文章

  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • 如何在 Fedora 36/35/34 上安装 TeamViewer

    团队查看器是一款功能强大的远程桌面和文件共享应用程序 适用于大多数操作系统和移动设备 为了将 TeamViewer 的使用商业化 您必须购买许可证 您可以免费使用它 仅供个人使用 Teamviewer 的 RPM 包由官方团队构建 可以安装
  • 如何更改 PHP 会话超时

    作为 Web 开发人员 了解 PHP 会话超时对于构建安全可靠的 Web 应用程序至关重要 PHP 会话是一种跨多个页面存储用户信息的方式 会话超时是指会话在过期之前保持活动状态的持续时间 在本分步指南中 我们将引导您完成更改 PHP 会话
  • 如何在 Ubuntu、Debian 和 LinuxMint 上安装 Python 3.7

    在撰写本文时 Python 3 7 系列的最新稳定版本已可供安装 本文将帮助您在 Ubuntu 和 LinuxMint 操作系统上安装 Python 3 7 9 你可以拜访here阅读有关 Python 版本的更多信息 先决条件 保持软件包
  • 如何在 Ubuntu 16.04、14.04 上安装 Nginx、PHP 7 和 MySQL

    PHP 7 2 的最新主要版本已经发布 在速度和安全性方面进行了大量优化 所以你应该尝试这个版本来进行开发 本教程将帮助您在 Ubuntu 17 10 16 04 和 14 04 LTS 版本上安装 Nginx PHP 7 2 和 MySQ
  • 了解 Terraform 语法和配置文件

    Terraform 由 HashiCorp 开发 是一款因其在基础设施即代码 IaC 方面的强大功能而广为人知的工具 本综合指南旨在让您深入了解 Terraform 语法 特别关注配置文件 了解 Terraform 语法 Terraform
  • Fedora 26 发布,新功能及升级步骤

    Fedora 26 发布 最终的 Fedora 26 已发布于2017 年 7 月 11 日 Fedora 26有各种软件升级 安全补丁 该版本将与 GENOME 3 24 一起发布 您可以从以下位置下载 Fedora 26 预发行版 Be
  • 如何重命名 SQL Server 数据库

    Microsoft SQL Server 为您提供了多种重命名数据库的方法 您可以使用 SQL Server Management Studio 或运行 SQL 查询来重命名数据库 在重命名数据库之前 请记住 它可能会中断使用当前数据库名称
  • 如何使用SCP命令安全传输文件

    SCP 安全复制 是一个命令行实用程序 允许您在两个位置之间安全地复制文件和目录 With scp 您可以复制文件或目录 从本地系统到远程系统 从远程系统到本地系统 在本地系统的两个远程系统之间 当传输数据时scp 文件和密码都经过加密 因
  • 如何在 CentOS 7 上安装 VMware Workstation Player

    VMware是一个成熟稳定的虚拟化解决方案 允许您在一台机器上运行多个独立的操作系统 您可以创建自己的虚拟机并评估许多软件供应商作为虚拟设备分发的软件 这些软件可从VMware 解决方案交流 本教程将指导您完成在 CentOS 7 上安装
  • 如何在 Ubuntu 18.04 上安装 Java

    Java 是世界上最流行的编程语言之一 用于构建不同类型的跨平台应用程序 本教程介绍如何在 Ubuntu 18 04 上安装各种版本的 OpenJDK 以及 Oracle Java 相同的说明适用于 Ubuntu 16 04 和任何基于 U
  • 如何在 Ubuntu 18.04 上安装 Apache Cassandra

    Apache Cassandra 是一个免费的开源 NoSQL 数据库 不存在单点故障 它提供线性可扩展性和高可用性 而不会影响性能 Apache Cassandra 被许多组织使用 包括 Apple NetFlix eBay 和 Easo
  • Linux 中的超时命令

    timeout是一个命令行实用程序 它运行指定的命令 并在给定时间段后终止该命令 如果该命令仍在运行 换句话说 timeout允许您运行有时间限制的命令 这timeout命令是 GNU 核心实用程序包的一部分 几乎所有 Linux 发行版上
  • 如何在 CentOS 7 上添加交换空间

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 在大多数情况下 当在虚拟机上运行 CentOS 时 不存在交换
  • 如何在 Ubuntu 18.04 上设置 Apache 虚拟主机

    在本教程中 我们将提供有关如何在 Ubuntu 18 04 上设置 Apache 虚拟主机的分步说明 Apache 虚拟主机允许您在一台计算机上运行多个网站 使用虚拟主机 您可以指定站点文档根目录 包含网站文件的目录 为每个站点创建单独的安
  • 如何在 Ubuntu 20.04 上安装和配置 VNC

    虚拟网络计算 VNC 是一种图形桌面共享系统 允许您使用键盘和鼠标远程控制另一台计算机 它是 Microsoft 的开源替代品远程桌面协议 RDP 本文介绍如何在 Ubuntu 20 04 上安装和配置 VNC 服务器 我们还将向您展示如何
  • 如何在 Ubuntu 18.04 上禁用防火墙

    Ubuntu 附带了一个名为 UFW 简单防火墙 的防火墙配置工具 UFW 是一个用户友好的前端 用于管理 iptables 防火墙规则 其主要目标是使管理防火墙规则更容易 或者顾名思义 不复杂 强烈建议保持防火墙启用 但是 在某些情况下
  • 如何在 Debian 9 上安装 Jenkins

    Jenkins是一个开源自动化服务器 提供了一种设置持续集成和持续交付 CI CD 管道的简单方法 持续集成 CI 是一种 DevOps 实践 团队成员定期将代码更改提交到版本控制存储库 然后运行自动化构建和测试 持续交付 CD 是自动构建
  • 如何在 Debian 10 上配置 MySQL (MariaDB) 主从复制

    MySQL 复制是将数据从一台数据库服务器 主服务器 复制到一台或多台服务器 从服务器 的过程 MySQL 支持多种复制拓扑 其中主 从拓扑是最著名的拓扑之一 其中一台数据库服务器充当主服务器 而一台或多台服务器充当从服务器 默认情况下 复
  • 如何在 Ubuntu 18.04 上安装 Ghost

    Ghost 是一个构建在 Node js 平台之上的现代源代码发布平台 它完全可定制且易于使用 使您可以以几乎零的学习曲线发布内容 在本教程中 我们将向您展示如何使用 Nginx 作为代理 免费的 Let s Encrypt SSL 证书
  • 使用 NumPy 范数计算向量和矩阵范数

    在线性代数中 范数是为向量空间中的每个向量分配严格正的长度或大小的函数 它是矢量大小的度量 从数学上来说 对于一个向量x the p 范数定义为 x p sum xi p 1 p 在本教程中 我们将使用numpy linalg norm f