【转载】流形学习 (Manifold Learning) ——(学习笔记)
第一篇: 摘抄自:https://zhuanlan.zhihu.com/p/54516805
从度量空间到拓扑空间
拓扑这门学科的一个方向涉及到去研究集合在“连续变形”下一些不变的性质。所谓的“连续变形”,直观理解就是像捏橡皮泥一样让集合的形状有一种连续的变化(后面会提到其实它就是指同胚(homeomorphism),此处的“连续”也可以先按度量空间里的“连续”来理解,即没有间断点)。
上图给出了从一个咖啡杯变成一个甜甜圈的连续过程,这个过程就是“连续变形”。拓扑学家会把两个可以通过“连续变形”的集合视作“同一东西“(称它们为拓扑等价)。
然后,我们要描述上面的过程,就需要对物体所处的空间进行一个刻画。我们当然可以在度量空间内对此进行描述,但是这会出现“不必要的”因素——度量。我们知道,在“连续变形”下,集合的距离或大小是次要的(想象一下不同大小的两个球是拓扑等价的)。因此,我们需要一个更“好”的空间来描述我们的问题,在这个空间里距离不是一个必要的因素。这引发了数学家对更加抽象的空间的思考,而他们最终的灵感来自于下面的定理。
定理1告诉我们,判断一个映射是否连续,我们可以抛开度量空间中距离的概念,仅单纯依靠对开集的认识,我们同样可以得出连续或者不连续的结论。那么如果让拓扑中包含了开集的内容(让拓扑告诉我们何为开集),然后根据上述定理1,我们还是能够判断一个映射是否连续。同时,结合关于开集的如下事实:
考虑到拓扑结构内需要有封闭性,我们就有了这样一个关于拓扑空间的定义。
举两个具体的例子:
进一步地,我们可以把连续函数的概念也进行推广。
由定理1我们也能够很好的理解,在度量空间中的连续函数,同样是由其度量导出的拓扑空间中的连续函数,即我们将连续函数的概念也进行了推广。进而有了我们的同胚映射。
附录:度量空间
提供了关于度量空间、开集以及连续的定义。
度量空间是欧式空间的一个很自然的推广。
由此也就能定义我们熟悉的开集的概念。
在度量空间中,连续的定义也是欧式空间内定义的直接推广。
PS:
个人观点:拓扑空间是一种集合空间,欧式空间是一种度量空间。
===============================================
文章2:(摘抄) 怎样理解流形维数?
原文地址: https://www.zhihu.com/question/20383709?sort=created
作者:一叶孤舟
链接:https://www.zhihu.com/question/20383709/answer/19023691
来源:知乎
首先要知道什么是流形,流形首先是拓扑空间,它的维数实际上是与它同胚的欧式空间维数是相等的。比如一个球体,它在欧式空间上是3维的,那么我们可以证明它是3维流形。又比如单纯的n维欧式空间就是n维流形。
现实生活中存在很多复杂的空间,所以光是欧式空间,坐标等不能很好的表示空间中的坐标点。这时就需要流形中的坐标卡,它的局部活动坐标系能覆盖空间中的每个点,这也是现在流形比较广泛运用在天体物理学等各个当面的原因。而且在流形上我们还能推导出很多欧式空间上的定义,如微分,切场等,这就加快了流形的发展。
流形M每一点的领域同胚一个R^n的开子集(这个开子集一定是n维的), 所以M是n维流形。
实际上流形就是曲线曲面的高维推广
===============================================
文章3:(摘抄)浅谈流形学习 https://www.cnblogs.com/bnuvincent/p/6524287.html
一个 d 维的流形就是一个在任意点出局部同胚于(简单地说,就是正逆映射都是光滑的一一映射)欧氏空间 。
球面的参数方程:
再来看流形学习里经常用到的人脸的例子,就很自然了。下图是 Isomap 论文里的一个结果:
这里的图片来自同一张人脸(好吧,其实是人脸模型),每张图片是 64×64 的灰度图,如果把位图按照列(或行)拼起来,就可以得到一个 4096 维的向量,这样一来,每一张图片就可以看成是 4096 维欧氏空间中的一个点。很显然,并不是 4096 维空间中任意一个点都可以对应于一张人脸图片的,这就类似于球面的情形,我们可以假定所有可以是人脸的 4096 维向量实际上分布在一个 d 维 (d < 4096) 的子空间中。而特定到 Isomap 的人脸这个例子,实际上我们知道所有的 698 张图片是拍自同一个人脸(模型),不过是在不同的 pose 和光照下拍摄的,如果把 pose (上下和左右)当作两个自由度,而光照当作一个自由度,那么这些图片实际只有三个自由度,换句话说,存在一个类似于球面一样的参数方程(当然,解析式是没法写出来的),给定一组参数(也就是上下、左右的 pose 和光照这三个值),就可以生成出对应的 4096 维的坐标来。换句话说,这是一个嵌入在 4096 维欧氏空间中的一个 3 维流形。 实际上,上面的那张图就是 Isomap 将这个数据集从 4096 维映射到 3 维空间中,并显示了其中 2 维的结果,图中的小点就是每个人脸在这个二维空间中对应的坐标位置,其中一些标红圈的点被选出来,并在旁边画上了该点对应的原始图片,可以很直观地看出这两个维度正好对应了 pose 的两个自由度平滑变化的结果。 就我目前所知,把流形引入到机器学习领域来主要有两种用途:一是将原来在欧氏空间中适用的算法加以改造,使得它工作在流形上,直接或间接地对流形的结构和性质加以利用;二是直接分析流形的结构,并试图将其映射到一个欧氏空间中,再在得到的结果上运用以前适用于欧氏空间的算法来进行学习。 这里 Isomap 正巧是一个非常典型的例子,因为它实际上是通过“改造一种原本适用于欧氏空间的算法”,达到了“将流形映射到一个欧氏空间”的目的。 :) Isomap 所改造的这个方法叫做 Multidimensional Scaling (MDS) ,MDS 是一种降维方法,它的目的就是使得降维之后的点两两之间的距离尽量不变(也就是和在原是空间中对应的两个点之间的距离要差不多)。只是 MDS 是针对欧氏空间设计的,对于距离的计算也是使用欧氏距离来完成的。如果数据分布在一个流形上的话,欧氏距离就不适用了。
让我们再回到地球——这个在三维空间中的二维流形,假设我们要在三维空间中计算北极点和南极点的距离,这很容易,就是两点相连的线段的长度,可是,如果要在这个流形上算距离就不能这样子算了,我们总不能从北极打个洞钻到南极去吧?要沿着地球表面走才行,当然,如果我随便沿着什么路线走一遍,然后数出总共走了多少步作为距离,这是不成的,因为这样一来如果我沿着不同的路线走,岂不是会得到不同的距离值?总而言之,我们现在需要一个新的定义在地球表面(流形)上的距离度量,理论上来说,任意满足测度的 4 个条件的函数都可以被定义为距离,不过,为了和欧氏空间对应起来,这里选择一个直线距离的推广定义。
回到 Isomap ,它主要做了一件事情,就是把 MDS 中原始空间中距离的计算从欧氏距离换为了流形上的测地距离。当然,如果流形的结构事先不知道的话,这个距离是没法算的,于是 Isomap 通过将数据点连接起来构成一个邻接 Graph 来离散地近似原来的流形,而测地距离也相应地通过 Graph 上的最短路径来近似了。如下图所示:
这个东西叫做 Swiss Roll ,姑且把它看作一块卷起来的布好了。图中两个标黑圈的点,如果通过外围欧氏空间中的欧氏距离来计算的话,会是挨得很近的点,可是在流形上它们实际上是距离很远的点:红色的线是 Isomap 求出来的流形上的距离。可以想像,如果是原始的 MDS 的话,降维之后肯定会是很暴力地直接把它投影到二维空间中,完全无视流形结构,而 Isomap 则可以成功地将流形“展开”之后再做投影。
除了 Isomap 之外,Manifold Embedding 的算法还有很多很多,包括 Locally Linear Embedding 、Laplacian Eigenmaps 、Hessian Eigenmaps 、Local Tangent Space Alignment、Semidefinite Embedding (Maximum Variance Unfolding) 等等等等。哪个好哪个坏也不好说,它们都各有特点,而且也各自有不少变种。网上有一个 Matlab 的 demo ,给出了几种流行的 manifold embedding 算法在一些 synthetic manifold 上的结果和对比,可以有一个直观的认识。
另一方面是改造现有算法使其适合流形结构甚至专门针对流形的特点来设计新的算法,比较典型的是 graph regularized semi-supervised learning 。简单地说,在 supervised learning 中,我们只能利用有 label 的数据,而(通常都会有很多的)没有 label 的数据则白白浪费掉。在流形假设下,虽然这些数据没有 label ,但是仍然是可以有助于 Learn 出流形的结构的,而学出了流形结构之后实际上我们就是对原来的问题又多了一些认识,于是理所当然地期望能得到更好的结果喽。
当然,所有的这些都是基于同一个假设,那就是数据是分布在一个流形上的(部分算法可能会有稍微宽松一些的假设),然而 real world 的数据,究竟哪些是分别在流形上的呢?这个却是很难说。不过,除了典型的 face 和 hand written digit 之外,大家也有把基于流形的算法直接用在诸如 text 看起来好像与流形没有什么关系的数据上,效果似乎也还不错。
最后是总结:所谓 Machine Learning 里的 Learning ,就是在建立一个模型之后,通过给定数据来求解模型参数。而 Manifold Learning 就是在模型里包含了对数据的流形假设。
“流形”这个中文词取自文天祥的“天地有正气,杂然赋流形”,这个词第一次作为当前的数学意义使用是由北大数学系的一位老教授江泽涵老先生。老先生是我国代数拓扑学的开拓者。
=============================
个人 PS:
球面是一个典型的流形, 可以将球面看做是三维欧式空间中的一个子空间,之所以这么说是因为球面确实可以在三维欧式空间中进行表示但是并不满足欧式空间中定义的运算法则,因为这个球面定义的空间空间是空心的,球面上两点的距离其实就是球面上两点的最短(测地)距离。
“嵌入在高维空间中的低维流形”,由前面的讨论可知流形其实是一个集合空间(一种拓扑空间)并不是欧式空间这种的度量空间,形象而粗略的形容流行可以说流形式高维欧式空间中的高维曲线曲面所定义的子空间(非欧式),这里的子空间是指拓扑空间,或者说是一种集合空间,也可以粗略的把这个子空间看做是抽象意义上的数据点的集合。这个在高维欧式空间中所定义的高维曲线曲面空间(拓扑空间,集合空间,流形),而这个曲线曲面所形成的拓扑空间或者说流形的维度是要小于这个高维欧式空间的维度的,因此有了“嵌入在高维空间中的低维流形”的这个说法。
或许,流形的维度可以用在欧式空间中的参数方程的变量自由度来表示。
流形,这个概念个人感觉太偏理论,一般用来做理论解释还是可以的,其他的想要用流形来做些什么个人感觉可能性不大,个人观点这个“流形” 和 机器学习领域的“概念学习”估计有些像,都是属于理论解释界的大佬但实际应用却不太行。
===============================================
文章4:(摘抄) http://blog.csdn.net/chl033/article/details/6107042
假设数据是均匀采样于一个高维欧氏空间中的低维流形,流形学习就是从高维采样数据中恢复低维流形结构,即找到高维空间中的低维流形,并求出相应的嵌入映射,以实现维数约简或者数据可视化。
流形学习是个很广泛的概念。这里我主要谈的是自从2000年以后形成的流形学习概念和其主要代表方法。自从2000年以后,流形学习被认为属于非线性降维的一个分支。众所周知,引导这一领域迅速发展的是2000年Science杂志上的两篇文章: Isomap and LLE (Locally Linear Embedding)。
和一般的降维分析一样,流形学习把一组在高维空间中的数据在低维空间中重新表示。和以往方法不同的是,在流形学习中有一个假设,就是所处理的数据采样于一个潜在的流形上,或是说对于这组数据存在一个潜在的流形。对于不同的方法,对于流形性质的要求各不相同,这也就产生了在流形假设下的各种不同性质的假设,比如在Laplacian Eigenmaps中要假设这个流形是紧致黎曼流形等。
对于描述流形上的点,我们要用坐标,而流形上本身是没有坐标的,所以为了表示流形上的点,必须把流形放入外围空间(ambient space)中,那末流形上的点就可以用外围空间的坐标来表示。比如R^3中的球面是个2维的流形,因为球面上只有两个自由度,但是球面上的点一般是用外围R^3空间中的坐标表示的,所以我们看到的R^3中球面上的点有3个数来表示的。当然球面还有柱坐标球坐标等表示。对于R^3中的球面来说,流形学习可以粗略的概括为给出R^3中的表示,在保持球面上点某些几何性质的条件下,找出找到一组对应的内蕴坐标(intrinsic coordinate)表示,显然这个表示应该是两维的,因为球面的维数是两维的。这个过程也叫参数化(parameterization)。直观上来说,就是把这个球面尽量好的展开在通过原点的平面上。在PAMI中,这样的低维表示也叫内蕴特征(intrinsic feature)。一般外围空间的维数也叫观察维数,其表示也叫自然坐标(外围空间是欧式空间)表示,在统计中一般叫observation。
===============================================
文章5:(摘抄) https://leovan.me/cn/2018/03/manifold-learning/
(说明:摘抄时去掉了一些数学解释,一个原因是自己没看懂,另一个原因感觉这个写的数学好像还没差些意思)
在原始数据中各个特征之间存在着一定的信息冗余,随着特征的不断增加就容易出现“维数灾难”的问题,因此降维的目的就是在尽可能多的保留原始信息的同时减少数据的维度。一般情况下我们将降维方法分为:线性降维方法和非线性降维方法,线性降维方法的典型算法有:
- 主成份分析 (PCA, Principal Component Analysis) 1
- 线性判别分写 (LDA, Linear Discriminant Analysis) 2
- 多尺度变换 (MDS, Multi-Dimensional Scaling) 3
非线性降维方法中在此我们仅列举一些基于流行学习的算法:
在现实数据中,很多情况数据是无法通过线性的方法进行降维表示的,因此就需要非线性的降维算法出马了。
流形
在调研流形相关概念时,发现要想深一步的理解这些概念还是需要详细的了解微分几何相关的内容,鉴于本文的目的主要是介绍流形学习 (主要是降维角度) 的相关内容,因此我们对流形仅做一些粗略的介绍。
“流形”是英文单词 Manifold 的中文译名,它源于德文术语 Mannigfaltigkeit,最早出现在 Riemann 1851 年的博士论文中,用来表示某种属性所能取到的所有值 7。
如果拓扑空间是一个几何物体,同胚就是把物体连续延展和弯曲,使其成为一个新的物体。因此,正方形和圆是同胚的,但球面和环面就不是。用一幅图形象的理解同胚,例如下图所示的咖啡杯和甜甜圈 8:
也就是说其 3 个维度实际上是由 2 个变量控制的。
流形学习
第一个为瑞士卷 (Swiss Roll),其形状和我们日常生活中的瑞士卷相似;
第二个为 S 形曲线 (S Curve);
第三个为一个被切断的球面 (Severed Sphere)。
MDS
多尺度变换 (MDS, Multi-Dimensional Scaling) 3 是一种通过保留样本在高维空间中的不相似性 (Dissimilarity) 降低数据维度的方法,在这里不相似性可以理解为样本之间的距离。因此,根据距离的度量方式不同可以将其分为度量型 (metric) MDS 和 非度量型 (non-metric) MDS。度量型 MDS 通过计算不同样本之间距离的度量值进行降维,而非度量型则仅考虑距离的排序信息,在此我们仅对度量型 MDS 做简单介绍。
我们利用中国省会的地理位置给出 MDS 的一个示例,首先我们获取中国省会共 34 个点的坐标,其次我们计算两两之间的距离,我们仅利用距离信息利用 MDS 还原出 2 维空间中的坐标,可视化结果如下所示
其中,黑色的点为省会的真实位置,蓝色的点为利用距离矩阵和 MDS 还原出来的位置,为了绘制还原出的位置我们对 MDS 的结果做出了适当的翻转和变换。从结果中不难看出,尽管每个点的坐标相比真实坐标都有一定的偏离,但是其很好的保持了相对距离,这也正是 MDS 算法的要求。
ISOMAP
对于一些非线性的流形,如果使用线性的降维方法得到的效果就不尽人意了,例如上文中提到的瑞士卷。在 ISOMAP 中,我们首先引入一个测地线的概念,在距离度量定义时,测地线可以定义为空间中两点的局域最短路径。形象的,在一个球面上,两点之间的测地线就是过这两个点的大圆的弧线
LLE
局部线性嵌入 (LLE, Locally Linear Embedding) 5,从这个名称上我们不难看出其不同与 ISOMAP 那种通过都建邻接图保留全局结构的,而是从局部结构出发对数据进行降维。在 LLE 方法中,主要有如下的基本假设:
- 一个流形的局部可以近似于一个欧式空间
- 每个样本均可以利用其邻居进行线性重构
LE
LE (Laplacian Eigenmap) 6 的基本思想是认为在高维空间中距离近的点映射到低维空间中后其位置也相距很近。LE 从这个思想出发,最终将问题转化为求解图拉普拉斯算子的广义特征值问题,具体的一些证明不在这里详细展开说明,具体请参见原文,下面仅给出 LE 算法的流程:
SNE 和 t-SNE
SNE
SNE (Stochastic Neighbor Embedding) 16 是由 Hinton 等人提出的一种降维算法,其方法的基本假设如下:
- 对象之间的相似度可以用概率进行表示,即:相似的对象有更高的概率被同时选择,不相似的对象有较低的概率被同时选择。
- 在高维空间中构建的这种概率分布应该尽可能的同低维空间中的概率分布相似。
t-SNE
SNE 为我们提供了一种很好的降维方法,但是其本身也存在一定的问题,主要有如下两点:
- 不对称问题:损失函数中的 KL 散度具有不对称性,导致 SNE 更加关注局部结构,相比忽略了全局结构。
- 拥挤问题:从高维空间映射到低维空间后,不同类别的簇容易挤在一起,无法较好地区分开。
针对这两个问题,Maaten 等人又提出了 t-SNE 算法对其进行优化 17。
利用 t-SNE 对 MNIST 数据集进行降维可视化结果如下:
方法比较
针对上述的若干算法,我们简单列举一下每个算法的优缺点
对于瑞士卷 (Swiss Roll),S 形曲线 (S Curve) 和切断的球面 (Severed Sphere),我们利用不同的流形算法对其进行降维,可视化的对比结果如下面 3 张图所示,图中同时标注了算法的运行时间,实现主要参照了 scikit-learn 关于流形学习算法的比较 18。
文中相关图片绘制实现详见代码,本文部分内容参考了流形学习专题介绍 19, 流形学习 20,Chrispher 21 的博客和 bingo 22 的博客。
- Jolliffe, Ian T. “Principal component analysis and factor analysis.” Principal component analysis. Springer, New York, NY, 1986. 115-128.
- Balakrishnama, Suresh, and Aravind Ganapathiraju. “Linear discriminant analysis-a brief tutorial.” Institute for Signal and information Processing 18 (1998): 1-8.
- Cox, Trevor F., and Michael AA Cox. Multidimensional scaling. CRC press, 2000.
- Tenenbaum, Joshua B., Vin De Silva, and John C. Langford. “A global geometric framework for nonlinear dimensionality reduction.” Science 290.5500 (2000): 2319-2323.
- Roweis, Sam T., and Lawrence K. Saul. “Nonlinear dimensionality reduction by locally linear embedding.” Science 290.5500 (2000): 2323-2326.
- Belkin, Mikhail, and Partha Niyogi. “Laplacian eigenmaps for dimensionality reduction and data representation.” Neural computation 15.6 (2003): 1373-1396.
- 梅加强. 流形与几何初步
- https://zh.wikipedia.org/zh-hans/流形
- pluskid. 浅谈流形学习
- https://en.wikipedia.org/wiki/Whitney_embedding_theorem
- Silva, Vin D., and Joshua B. Tenenbaum. “Global versus local methods in nonlinear dimensionality reduction.” Advances in neural information processing systems. 2003.
- 何晓群. 多元统计分析
- Donoho, David L., and Carrie Grimes. “Hessian eigenmaps: Locally linear embedding techniques for high-dimensional data.” Proceedings of the National Academy of Sciences 100.10 (2003): 5591-5596.
- Zhang, Zhenyue, and Jing Wang. “MLLE: Modified locally linear embedding using multiple weights.” Advances in neural information processing systems. 2007.
- Zhang, Zhenyue, and Hongyuan Zha. “Principal manifolds and nonlinear dimensionality reduction via tangent space alignment.” SIAM journal on scientific computing 26.1 (2004): 313-338.
- Hinton, Geoffrey E., and Sam T. Roweis. “Stochastic neighbor embedding.” Advances in neural information processing systems. 2003.
- Maaten, Laurens van der, and Geoffrey Hinton. “Visualizing data using t-SNE.” Journal of machine learning research 9.Nov (2008): 2579-2605.
- http://scikit-learn.org/stable/auto_examples/manifold/plot_compare_methods.html
- 王瑞平. 流形学习专题介绍
- 何晓飞. 流形学习
- http://www.datakit.cn/blog/2017/02/05/t_sne_full.html
- http://bindog.github.io/blog/2016/06/04/from-sne-to-tsne-to-largevis/
====================================
【转载】流形学习 (Manifold Learning) ——(学习笔记)的更多相关文章
- 流形学习 (Manifold Learning)
流形学习 (manifold learning) zz from prfans............................... dodo:流形学习 (manifold learning) ...
- 流形学习(manifold learning)的一些综述
流形学习(manifold learning)的一些综述 讨论与进展 issue 26 https://github.com/memect/hao/issues/26 Introduction htt ...
- 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)
强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...
- 转载manifold learning一篇
我恨自己不干活儿,不过也没辙. 早晚要学习流形的,今天先转一篇文章,以后找不到就尿了. 我真羡慕数学系的人,╮(╯▽╰)╭. 发信人: Kordan (K&M), 信区: AI标 题: do ...
- 流形学习(manifold learning)综述
原文地址:https://blog.csdn.net/dllian/article/details/7472916 假设数据是均匀采样于一个高维欧氏空间中的低维流形,流形学习就是从高维采样数据中恢复低 ...
- Manifold learning 流形学习
Machine Learning 虽然名字里带了 Learning 一个词,让人乍一看觉得和 Intelligence 相比不过是换了个说法而已,然而事实上这里的 Learning 的意义要朴素得多. ...
- 【deep learning学习笔记】注释yusugomori的DA代码 --- dA.h
DA就是“Denoising Autoencoders”的缩写.继续给yusugomori做注释,边注释边学习.看了一些DA的材料,基本上都在前面“转载”了.学习中间总有个疑问:DA和RBM到底啥区别 ...
- [Machine Learning]学习笔记-Logistic Regression
[Machine Learning]学习笔记-Logistic Regression 模型-二分类任务 Logistic regression,亦称logtic regression,翻译为" ...
- Machine Learning 学习笔记
点击标题可转到相关博客. 博客专栏:机器学习 PDF 文档下载地址:Machine Learning 学习笔记 机器学习 scikit-learn 图谱 人脸表情识别常用的几个数据库 机器学习 F1- ...
- 转载-《Python学习手册》读书笔记
转载-<Python学习手册>读书笔记 http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html
随机推荐
- SDL3 入门(2):第一个窗口
在上一篇文章中我们已经利用 SDL 的日志接口实现了简单的字符串输出,实际上是解决了开发环境搭建问题,接下来我们将在已有代码的基础上继续开发,实现第一个窗口的创建和背景色绘制. 初始化 首先设置日志输 ...
- ChatGPT应用与实践初探
近期,长江商学院EMBA38期&甄知科技开展了题为"ChatGPT应用与实践初探"的线下沙龙活动,由上海甄知科技创始合伙人兼CTO张礼军主讲,主要给大家解密最近很火的Cha ...
- python类和对象初识
# python类和对象初识 a = 2 b = 3 print(id(a)) print(type(a)) print(a) print(id(b)) print(type(b)) print(b) ...
- Angular项目简单使用拦截器 httpClient 请求响应处理
1:为啥要使用拦截器 httpClient 请求响应处理,其作用我们主要是: 目前我的Angular版本是Angular 17.3,版本中实现请求和响应的拦截处理了.这种机制非常适合添加如身份验证头. ...
- python selenium使用无头模式执行用例
什么是无头模式? Headless Browser模式是浏览器的无界面状态,即在不打开浏览器界面的情况下使用浏览器. 该模式的好处如下: 1)可以加快web自动化测试的执行时间,对于web自动化测试, ...
- MYSQL8存储过程生成日历表以及异常处理
一.环境 数据库:mysql8.0.25 社区版 操作系统:windows 11 ------------------------------------ 二.创建日历表 CREATE TABLE ` ...
- Django部署在CENTOS7上
项目结构 /data/playback_project/├── PlayBack└── script /data/playback_project/PlayBack├── app01├── db.sq ...
- Docker部署php运行环境
编写docker-compose.yml配置文件,使用nginx作为web服务器,转发php的请求. version: "3" services: web: image: ngin ...
- 3568F-视频开发案例
- 免费领 | 2000件“直击灵魂”的Polo衫,创龙科技10周年献礼!
一件"有灵魂"的Polo衫 时光荏苒,创龙科技即将迎来10周年庆!为感谢各位客户多年的支持与信任,创龙科技特推出10周年献礼活动--2000件"直击灵魂&qu ...