数值分析:矩阵奇异值分解

2023-11-05

1. 奇异值分解(SVD)

(1)奇异值分解

已知矩阵\(\bm{A} \in \R^{m \times n}\), 其奇异值分解为:

\[\bm{A} = \bm{U}\bm{S}\bm{V}^T \]

其中\(\bm{U} \in \R^{m \times m}\)\(\bm{V} \in \R^{n \times n}\)是正交矩阵,\(\bm{S} \in \R^{m \times n}\)是对角线矩阵。\(\bm{S}\)的对角线元素\(\bm{s}_1, \bm{s}_2,..., \bm{s}_{\min(m,n)}\)是矩阵的奇异值。

(2) 奇异值分解的求解

而求矩阵的奇异值的算法非常简单,对于实数域下的矩阵\(A\),我们只需要求\(A^TA\)的特征值和特征向量。其特征向量归一化后即右奇异向量\(\bm{v}_1,\bm{v}_2,...,\bm{v}_n\),其特征值开根号即对应的奇异值\(\bm{s}_1, \bm{s}_2,..., \bm{s}_{\min(m,n)}\)。 然后由等式

\[\bm{A}\bm{v}_1=s_1\bm{u}_1, \\ \bm{A}\bm{v}_2=s_2\bm{u}_2, \\ ..., \\ A\bm{v}_{\min(m,n)} = \bm{s}_{\min(m,n)}\bm{u}_{\min(m,n)}\]

依次计算出相应的\(\bm{u}_i\)向量的值。
至于特征值的计算,采用 QR 算法,此处不予介绍,这里可以直接调用 np.linalg.eig()函数实现。以下给出奇异值计算代码实例(此处仅为知识演示,具体的工业级别的奇异值计算算法要复杂得多,参考 Golub 与 Van Loan《矩阵计算》)

import numpy as np
def svd(A):
    eigen_values, eigen_vectors = np.linalg.eig(A.T.dot(A))
    singular_values = np.sqrt(eigen_values)
    #这里奇异值要从大到小排序,特征向量也要随之从大到小排
    val_vec = [] #存储奇异值-特征向量对
    for i in range(len(eigen_values)):
        val_vec.append((singular_values[i], eigen_vectors[:, i]))
    val_vec.sort(key = lambda x:-x[0])
    singular_values = [ pair[0] for pair in val_vec]
    eigen_vectors = [ pair[1] for pair in val_vec]

    # 在计算左奇异向量之前,先要对右奇异向量也就是特征向量组成的基正交化
    # 不过linalg.eig返回的是已经正交化的,这一步可省略

    # 由等式Avi = siui(vi是右奇异向量, ui是左奇异向量)
    # 依次计算左奇异向量
    U = np.zeros((A.shape[0], A.shape[1]))
    for i in range(A.shape[1]):
        u = A.dot(eigen_vectors[i])/singular_values[i]
        U[:, i] = u
    # 给U加上标准正交基去构造R3的基
    for i in range(A.shape[1], A.shape[0]):
        basis = np.zeros((A.shape[0], 1))
        basis[i] = 1
        U = np.concatenate([U, basis], axis=1)
    eigen_vectors = [vec.reshape(-1, 1) for vec in eigen_vectors]
    eigen_vectors = np.concatenate(eigen_vectors, axis=1)
    return U, singular_values, eigen_vectors

if __name__ == '__main__':
    # 例一:普通矩阵
    A = np.array(
        [
            [0, 1],
            [0, -1]
        ]
    )
    # 例二:对称矩阵
    # A = np.array(
    #     [
    #         [0, 1],
    #         [1, 3/2]
    #     ]
    # )
    U, S, V = svd(A)
    print("我们实现的算法结果:")
    print(U, "\n", S, "\n", V)
    print("\n")
    print("调用库函数的计算结果:")
    # 调用api核对
    U2, S2, V2 = np.linalg.svd(A)
    print(U2, "\n", S2, "\n", V2)

对普通矩阵\(\left(\begin{matrix}0 & 1 \\0 & -1\end{matrix}\right)\)运行该算法的结果为:

我们实现的算法结果:
[[ 0.70710678  0.70710678]
 [-0.70710678 -0.70710678]] 
 [1.4142135623730951, 0.0] 
 [[0. 1.]
 [1. 0.]]


调用库函数的计算结果:
[[-0.70710678 -0.70710678]
 [ 0.70710678 -0.70710678]] 
 [1.41421356 0.        ] 
 [[-0. -1.]
 [-1.  0.]]

可以看到结果基本符合。此处矩阵\(\left(\begin{matrix}0 & 1 \\0 & -1\end{matrix}\right)\)的奇异值为0.41421和0。此处我们发现普通矩阵的奇异值可以为0。
对对称矩阵\(\left(\begin{matrix}0 & 1 \\1 & \frac{3}{2}\end{matrix}\right)\)运行该算法的结果为:

我们实现的算法结果:
[[-0.4472136   0.89442719]
 [-0.89442719 -0.4472136 ]] 
 [2.0, 0.5] 
 [[-0.4472136  -0.89442719]
 [-0.89442719  0.4472136 ]]


调用库函数的计算结果:
[[-0.4472136  -0.89442719]
 [-0.89442719  0.4472136 ]] 
 [2.  0.5] 
 [[-0.4472136  -0.89442719]
 [ 0.89442719 -0.4472136 ]]

可以看到结果基本符合。此处矩阵\(\left(\begin{matrix}0 & 1 \\0 & -1\end{matrix}\right)\)的奇异值为2和0.5。此处我们发现,对称矩阵的奇异值必为正,不可能为0。

(2)奇异值的应用1:推荐系统

在推荐系统中,我们常定义用户-评分矩阵,表示用户对商品的打分,这个矩阵我们称为共现矩阵。
而这就迫切地需要我们设计矩阵分解算法,为每一个用户和视频生成一个隐向量,将用户和视频定位到隐向量的表示空间上,并满足距离相近的用户和视频表示兴趣特点接近。
在推荐系统的应用场景下,我们企图使用矩阵分解算法将\(m\times n\)维的共现矩阵\(\bm{R}\)分解为\(m \times k\)维的用户矩阵和\(k*n\)维的物品矩阵(的转置)相乘的形式。其中\(m\)是用户数量,\(n\)是物品数量,\(k\)是隐向量。\(k\)的大小决定了隐向量表达能力的强弱。\(k\)越小,隐向量包含的信息越少,模型的泛化程度越高;反之,\(k\)越大,隐向量表达能力越强,泛化程度相应降低。此外,\(k\)的取值还与矩阵分解的求解复杂度直接相关。应用中,\(k\)的取值要经过试验多次找到一个推荐效果和工程开销的平衡。具体的形式如下图所示:

采用什么方法来进行矩阵分解呢?由矩阵分析的知识可得,特征值分解只能作用于方阵,显然不适合于分解用户-物品矩阵。我们在这里采用矩阵的奇异值分解以得到用户和物品的隐向量。
已知\(\bm{M}\)是矩阵\(m\times n\)的矩阵,则一定存在一个分解\(\bm{M} = \bm{U}diag(λ_1, λ_2,..., λ_n)\bm{V}^T\),其中\(U\)\(m*m\)的正交矩阵,\(V\)\(n\times n\)的正交矩阵,\(diag(λ_1, λ_2,..., λ_n)\)\(m \times n\)的对角阵。 我们取对角阵 \(diag(λ_1, λ_2,..., λ_n)\)中较大的\(k\)个元素做为隐含特征,删除\(diag(λ_1, λ_2,..., λ_n)\)中的其他维度及\(U\)\(V\)中对应的维度。矩阵\(M\)被分解为\(M=U_{m*k}diag(λ_1, λ_2,..., λ_k)V_{k*n}^T\),至此完成了隐向量维度为\(k\)的矩阵分解。 如果我们调用np.lialg.svd()函数接口,那我们可以将奇异值分解表述如下:

import numpy as np
if __name__ == '__main__':
    M = np.array(
        [
            [0, 4.5, 2.0, 0],
            [4.0, 0, 3.5, 0],
            [0, 5.0, 0, 2.0],
            [0, 3.5, 4.0, 1.0]
        ]
    )
    U, S, V_T = np.linalg.svd(M)
    k = 2 # 取前2个奇异值对应的隐向量
    # 分别打印物品向量和用户向量
    Vec_user, Vec_item = U[:,:k], V_T[:k, :].T
    print(Vec_user, "\n\n", Vec_item)

该算法对运行结果为:

[[-0.55043774  0.1361732 ]
 [-0.26216705 -0.86775439]
 [-0.52483774  0.4552962 ]
 [-0.5939967  -0.1454804 ]] 

 [[-0.12135946 -0.63908086]
 [-0.83093848  0.43821815]
 [-0.50855715 -0.61619448]
 [-0.19021762  0.14087178]]

可以看到我们由共现矩阵成功得到了用户向量和物品向量。
然而,运在推荐系统中的传统奇异值分解存在两点重大的缺陷:

  • 奇异值分解要求原始共现矩阵是稠密的,而互联网场景下用户非常少,用 户-物品的共现矩阵非常系数。如果使用 SVD,就必须对缺失的元素值进行填充。
  • 传统奇异值分解的计算复杂度达到了\(O(mn^2)\)的级别,这对于商品数量动辄上百万,用户数量往往上千万的互联网场景来说根本不可接受。 所以,传统奇异值分解不适用于解决大规模稀疏矩阵的矩阵分解。因此,梯度下降法成为了矩阵分解的主要方法。这部分内容我们会在推荐系统专栏中进行讲解。

(3)奇异值的应用2:矩阵的低秩近似和数据降维

将矩阵的奇异值分解形式\(\bm{M} = \bm{U}\bm{S}\bm{V}^T\)中的对角阵进一步写成多个子矩阵的和,我们有:

\[\bm{A} = \bm{U}\bm{S}\bm{V}^T=\bm{U} \left( \begin{matrix} s_1 & & \\ & \ddots & \\ & & s_r\\ & & \\ \end{matrix} \right) \bm{V}^T \\ =\bm{U} \left( \left( \begin{matrix} s_1 & & \\ & & \\ & & \\ & & \\ \end{matrix} \right) + \left( \begin{matrix} & & \\ & s_2 & \\ & & \\ & & \\ \end{matrix} \right) + \left( \begin{matrix} & & \\ & & \\ & & s_r\\ & & \\ \end{matrix} \right) \right) \bm{V}^T \\ =s_1\bm{u}_1\bm{v}_1^T+s_2\bm{u}_2\bm{v}_2^T+... + s_r\bm{u}_r\bm{v}_r^T \]

注意,这里\(\bm{u}_1\)\(\bm{v}_1\)是做外积,运算得到一个矩阵。 也就是说,\(m\times n\)的矩阵\(\bm{A}\)可以写成秩为1的矩阵和,即:

\[ \bm{A} = \sum_{i=1}^{r}s_i\bm{u}_i\bm{v}_i^{T} \]

我们将这个性质称为 SVD 的低秩近似性质。
在介绍 SVD 的底秩近似的应用前,我们先介绍数据降维的思想。降维的思想是将数据投影到低维空间,假设\(\bm{a}_{1},\bm{a}_2...,\bm{a}_n\)都是\(m\)维向量(在数据科学的应用中, 一般\(m\)远小于\(n\),想想为什么)。降维的目标是使用\(n\)\(p\)维的向量替换原本的\(n\)\(m\)维的向量,其中新向量的维度\(p<m\),同时最小化该过程引入的误差。
那么 SVD 其实天然可以用于降维。我们定义矩阵\(A\)的秩\(p\)近似,将矩阵\(A\)的奇异值分解保留前\(p\)项,即:

\[\bm{A}_p = \bm{U}_{m\times p}\bm{S}_{p\times p}\bm{V}_{p*n}^T \]

也就是其低秩近似形式保留前\(p\)项,

\[\bm{A}_p= \sum_{i=1}^{p}s_i\bm{u}_i\bm{v}_i^{T} \]

这个式子也可以看做\(\bm{A}\)的最优最小二乘近似形式,即:

\[\bm{A}_p= \underset{\bm{B}}{\text{argmin}}||\bm{A} − \bm{B}||_F \]

这里,\(\bm{B}\)的大小和\(\bm{A}\)一样,\(\bm{B} \in \bm{\R}^{m\times n}\)(但是\(rank(\bm{B})\leqslant p\)),\(F\)指F范数。这里的F范数可以推广到任意的酉不变范数\(||\bm{A} − \bm{B}||_U\),不过在常规的使用中,大家就使用\(F\)范数就够了。
矩阵最优近似是有着几何解释的。空间\(<\bm{u}_1,...,\bm{u}_p>\)由左奇异向量\(\bm{u}_1,...,\bm{u}_p\)长成,这是对于\(\bm{a}_1,...,\bm{a}_n\)\(p\)维子空间在最小二乘意义上的最优近似,\(\bm{A}\)的列\(\bm{a}_i\)在该空间上的正交投影对应\(\bm{A}_p\)的列。换句话讲,一组向量 \(\bm{a}_1,\bm{a}_2,...,\bm{a}_n\)找到其最优的最小二乘\(p\)维子空间的投影(最小二乘后面会介绍,这里暂时理解不了也没关系)就是矩阵最优的秩\(p\)近似矩阵\(\bm{A}_p\)
比如,我们要找到最优的一维子空间拟合数据向量\((3,2)^T,(2,4)^T,(-2,-1)^T,(-3,-5)^T\)。 4 个向量近似指向相同的一维子空间,我们想找出这个子空间,该空间能够使向量投影到子空间的平方误差和最小。然后我们找出投影向量,投影向量组成的矩阵就是我们要求的近似矩阵\(\bm{A}_p\)
如下图所示:电影爱好者的评分情况示意图
算法如下:

import numpy as np
from sklearn.decomposition import PCA
def approximation(A, p):
    U, s, V_T = np.linalg.svd(A)
    B = np.zeros(A.shape)
    for i in range(p):
        B += s[i]*U[:,i].reshape(-1, 1).dot(V_T[i, :].reshape(1, -1))
    return B

if __name__ == '__main__':
    # 例一:
    # A = np.array(
    #     [
    #         [0, 1],
    #         [1, 3/2],
    #     ]
    # )
    # 例二:
    A = np.array(
        [
            [3, 2, -2, -3],
            [2, 4, -1, -5]
        ]
    )

    # p为近似矩阵的秩,秩p<=r
    p = 1
    B = approximation(A, p)
    print(B)

    #最终得到的矩阵秩
    print(np.linalg.matrix_rank(B))

(注意,numpy 内置的 SVD 函数返回的是\(V^T\)而不是\(V\),我就在这儿犯过错。。。 导致后面求出来的近似矩阵不对/(ㄒoㄒ)/~~)
最终对例一矩阵\(\left(\begin{matrix}0 & 1 \\1 & \frac{3}{2}\end{matrix}\right)\)运行算法的结果如下:

[[0.4 0.8]
 [0.8 1.6]]
1

该矩阵的四个列向量对应原始数据向量的投影向量。可以看到这四个向量线性相关, 且最终得到的矩阵的秩为1。
最终对例二矩阵\(\left(\begin{matrix}3 & 2 &-2 &-3 \\2 & 4 & -1 & -5 \end{matrix}\right)\)运行算法的结果如下:

[[ 1.99120445  2.59641446 -1.16885153 -3.41876737]
 [ 2.73456571  3.56571418 -1.60521001 -4.69506988]]
1

该矩阵的四个列向量对应原始数据向量的投影向量。可以看到这四个向量线性相关, 且最终得到的矩阵的秩也为1。
也就是说我们的算法对这两个矩阵都达到了我们低秩近似的效果。因为降维后这两个矩阵的四个向量同属于一个一维子空间,我们只需要一个维度就可以区分这四个向量了,因此我们达到了数据降维的效果。

(3)奇异值的应用3:压缩

矩阵的奇异值分解可以用于压缩矩阵信息。我们注意到矩阵的展开式

\[\bm{A} = \sum_{i=1}^{r}s_i\bm{u}_i\bm{v}_i^{T} \]

中,每一项使用两个向量\(\bm{u}_i\),\(\bm{v}_i\),以及一个数字\(s_i\)定义。如果\(\bm{A}\)是一个\(n\times n\)矩阵,我们可以尝试矩阵\(\bm{A}\)的有损压缩,及扔掉求和后面的几项,它们具有较小的\(s_i\),也就是说对数据的存储而言显得“无关紧要”。就这样,我们可以保留前\(p\)项,将矩阵的\(p\)秩近似做为矩阵的压缩结果。\(p\)越多则近似矩阵对矩阵的近似程度越高,压缩程度越低;\(p\)越少则近似矩阵对矩阵的近似程度越低,压缩程度越高。每一项包括\(\bm{u}_i\)向量、\(\bm{v}_i\)向量和一个数字\(s_i\),总共需要\(2n+1\)个数字保存或者传输。例如,当\(n=8\)时,矩阵由\(64\)个图片定义。但是我们可以传输或者保存矩阵的第一项展开,仅仅使用\(2n+1=17\)个数字。如果大量信息可以由第一项捕捉, 例如,当第一个奇异值比其他的奇异值大得多的时候,以这种方式处理可能节省\(75\%\)的空间。
算法如下:

import numpy as np
from sklearn.decomposition import PCA
import cv2 as cv
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif']=[u'SimHei']
mpl.rcParams['axes.unicode_minus']=False
def approximation(A, p):
    U, s, V_T = np.linalg.svd(A)
    B = np.zeros(A.shape)
    for i in range(p):
        B += s[i]*U[:,i].reshape(-1, 1).dot(V_T[i, :].reshape(1, -1))
    return B

if __name__ == '__main__':
    img = cv.imread("chapter12.特征值和奇异值/12.4.SVD的应用/12.4.3.图像压缩/img.jpeg", flags=0)
    img_output = img.copy()

    # p为近似矩阵的秩,秩p<=r,p越大图像压缩程度越小,越清晰
    p = 50
    img_output = approximation(img, p)
    fig, axs = plt.subplots(1, 2)
    axs[0].imshow(img)
    axs[0].set_title('原图')
    axs[1].imshow(img_output)
    axs[1].set_title('压缩后的图')
    plt.savefig('chapter12.特征值和奇异值/12.4.SVD的应用/12.4.3.图像压缩/result.png')
    plt.show()

最终图片的压缩效果:电影爱好者的评分情况示意图

知名程序库和源码阅读建议

SVD 算法有很多优秀的开源甚至分布式的实现,这里推荐几个项目:

(1) Gensim

Gensim 是一个采用 Python 和 Cpython 实现的自然语言库,提供了很多统计自然语言处理算法的实现,也包括我们这里提到的 SVD 算法。文档地址https://radimrehurek.com/gensim/源码地址https://github.com/RaRe-Technologies/gensim.git

(2) Spark-MLlib

Spark 除了包含 GraphX,它还包括了机器学习库 MLlib,其中就有奇异值分解的分布式实现。文档地址https://spark.apache.org/mllib/源码地址https://github.com/apache/spark

参考文献

  • [1] Timothy sauer. 数值分析(第2版)[M].机械工业出版社, 2018.
  • [2] Golub, Van Loan. 矩阵计算[M]. 人民邮电出版社, 2020.
  • [3] 深度学习推荐系统[M]. .2020
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数值分析:矩阵奇异值分解 的相关文章

  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • Django 的内联管理:一个“预填充”字段

    我正在开发我的第一个 Django 项目 我希望用户能够在管理中创建自定义表单 并向其中添加字段当他或她需要它们时 为此 我在我的项目中添加了一个可重用的应用程序 可在 github 上找到 https github com stephen
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • 在 Sphinx 文档中*仅*显示文档字符串?

    Sphinx有一个功能叫做automethod从方法的文档字符串中提取文档并将其嵌入到文档中 但它不仅嵌入了文档字符串 还嵌入了方法签名 名称 参数 我如何嵌入only文档字符串 不包括方法签名 ref http www sphinx do
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 使用特定颜色和抖动在箱形图上绘制数据点

    我有一个plotly graph objects Box图 我显示了箱形 图中的所有点 我需要根据数据的属性为标记着色 如下所示 我还想抖动这些点 下面未显示 Using Box我可以绘制点并抖动它们 但我不认为我可以给它们着色 fig a
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • 【AI实战营第二期】第三次作业——基于 RTMDet 的气球检测(包含数据集)

    作业 基于 RTMDet 的气球检测 背景 熟悉目标检测和 MMDetection 常用自定义流程 任务 基于提供的 notebook 将 cat 数据集换成气球数据集 按照视频中 notebook 步骤 可视化数据集和标签 使用MMDet
  • three.js---一个基础的demo

    在学习three js过程中 不难发现 每新开发一个3D场景都会从创建场景 scene 创建物体 创建相机这三个基础的方法开始 从而在其身上衍生出其他的一些API 为了方便日后的开发 特此记录一个简单基础的demo 在之后的开发中可直接使用
  • python测试网络连通性_PYTHON 测试服务器连通性

    coding utf 8 import os import sys import urllib2 import pygame import re import socket import subprocess 输入要测试的site值 pri
  • 基于Jenkins CICD的代码发布与回滚

    案例知识点 1 Jenkins 介绍 Jenkins 原名 Hudson 2011 年改为现在的名字 它是一个开源的实现持续集成的软件工具 官方网站 https jenkins io Jenkins 能实施监控持续集成过程中所存在的问题 提
  • UI自动化测试-第一个测试脚本

    前提 我们在进行UI自动化测试时 一般采用java selenium或者python selenium的方式 由于python比较简单 上手快 因此建议大家采用python selenium的方式来进行UI自动化 1 安装pycharm P
  • 浏览器控制器进行request(ajax)请求

    浏览器控制器进行request ajax 请求 问题 代码 问题 前后分离开发时 经常出现跨域问题 用postman开发的时候不会出现 所以用以下代码在浏览器的控制器里面进行模拟请求 做个记录 代码 var url http XXX XXX
  • Unable to cast object of type ‘System.Byte[]‘ to type ‘System.System.String‘

    环境 C MySQL数据库 asp net core 3 1 问题 调试 确实有问题 异常还原与异常信息一致 初步分析为数据库数据表实体类映射字段没对起来 检查数据库数据表与实体类映射 发现 某字段类型为longblob 映射类型为Stri
  • Qt开发记录18——授权校验

    授权校验 Windows系统 获取cpu序列号 BIOS序列号 网卡mac地址 代码 Linux系统 获取硬盘序列号 网卡MAC地址 代码 生成的授权码 代码 读取授权文件中的授权码 代码 校验 代码 Windows系统 获取cpu序列号
  • Java Stream流操作

    Stream目录 一 概述 二 分类 三 具体用法 1 流的常用创建方法 1 1 使用Collection下的 stream 和 parallelStream 方法 1 2 使用Arrays 中的 stream 方法 将数组转成流 1 3
  • 使用PlayerPrefs的数据存储

    LasText text 上次 长度 PlayerPrefs GetInt lastl 0 上次 分数 PlayerPrefs GetInt lasts 0 如果上次长度没有 则设置上次长度为零 PlayerPrefs SetInt las
  • VLC media player 官方下载

    http www videolan org vlc index zh html
  • HTML5制作个人简历模板

    利用表格标签制作一个个人简历的模板 代码片段如下 table cellspacing 1 width 700px align center caption 个人简历 caption tr height 45 th 姓名 th td td t
  • 弱网测试及工具对比(Fiddler/Charles/NEWT/Clumsy/ATC/WANem/QNET)

    1 什么是弱网测试 弱网测试主要就是对带宽 丢包 延时等进行模拟弱网环境 衡量网络性能好坏的几个指标 带宽 吞吐量 单位时间内传输的数据量 单位通常是 每秒比特数 bps 带宽反映了网络的传输能力 越大越好 丢包 数据丢包个数 发送的数据包
  • MySQL中concat

    MySQL中使用concat拼接字符集 用mysql统计数据总和 需要拼接中文 发现是乱码 一直以为自己写的sql有问题 最后一查原来是因为使用concat函数时 需要转换参数类型 1 乱码sql 直接使用concat拼接中文和统计结果 s
  • 数据结构-多项式的基本操作(链表实现)

    include
  • 虚机Centos忘记密码如何重置 -- 小黑日常超细教学

    有时候虚机太多 会忘记有一些虚机的密码 当启动机器的时候那我们可以尝试重置虚机密码然后登录 日常的小技能记述 目录 一 演示虚机为centos7系列 二 进入开机前的页面 选中第一个 按 e 键 进入编辑模式 三 找到ro crashker
  • ALIGN_SIZE宏解释

    转载 http blog chinaunix net uid 27879959 id 3880459 html 0 tsina 1 63290 397232819ff9a47a7b7e80a40613cfe1
  • 会话固定攻击(session fixation attack)及解决办法

    1 Cookie 的工作过程 Cookie的传递用到了两个字段 请求头字段Cookie和响应头字段Set Cookie 当用户浏览器第一次访问服务器的时候 服务器肯定是不知道他的身份的 所以 就要创建一个独特的身份识别数据 格式是 key
  • 本地maven仓库有jar包但是pom却报错

    发生背景 电脑已经存在了一个项目 需要导入另外一个项目 将新项目的maven地址指向之前那个项目的maven仓库 出现mybatis spring boot在pom中报红 去找jar对应的文件夹 发现jar已存在 但是还是报错 解决 根据网
  • 数值分析:矩阵奇异值分解

    1 奇异值分解 SVD 1 奇异值分解 已知矩阵 bm A in R m times n 其奇异值分解为 bm A bm U bm S bm V T 其中 bm U in R m times m bm V in R n times n 是正