【论文阅读】Anchor-based fast spectral ensemble clustering
论文地址:Anchor-based fast spectral ensemble clustering - ScienceDirect
代码地址:
摘要
集成聚类通过融合多个基础聚类方法,可以获得更好且更稳健的结果,因此受到广泛关注。尽管近年来已经出现了许多代表性的算法,但该领域仍然存在两个棘手的问题。首先,谱聚类能够识别任意形状的聚类,但其高时间和空间复杂度限制了其在生成基础聚类时的应用。现有的大多数算法使用 k-means 来生成基础聚类,但对于非线性可分数据集的聚类效果仍需进一步改进。其次,集成聚类算法应该生成多个基础聚类。即使应用低复杂度的算法,运行时间仍然较长,这严重影响了集成聚类算法在大规模数据集上的应用。为了解决这些问题,作者提出了一种快速的 K-最近邻近似方法,构建锚点图以近似相似度矩阵,并使用奇异值分解(SVD)代替特征值分解(EVD),从而降低了传统谱聚类的时间和空间复杂度。同时,通过一次运行谱嵌入获得多个基础聚类。最后,将这些基础聚类转换为二分图,并使用转移切割(transfer cut)得到最终的聚类结果。所提算法显著降低了集成聚类的运行时间。对大规模数据集的实验结果充分证明了提出的算法的效率和优越性。
引言
聚类将给定的一组样本划分为多个簇,以确保同一簇内的样本具有较高的相似性,而不同簇之间的样本相似性较低。作为无监督机器学习的核心部分,聚类在推荐系统[1-3]、模式识别[4,5]、图像分割[6-8]等领域具有重要作用。经过多年的发展,研究人员提出了许多聚类算法,如k-means[9-11]、层次聚类[12-14]和谱聚类[15-17]等。其中,谱聚类由于在非线性可分数据集上的良好表现,受到了广泛的关注和研究。传统的谱聚类的时间和空间复杂度很高,主要体现在相似度矩阵构建和特征值分解(EVD)上。这两个步骤的时间复杂度分别为 O(N²d) 和 O(N²k),空间复杂度为 O(N²),其中 N 是样本数,k 是类别数,d 是数据集的维度。高时间和空间复杂度大大限制了谱聚类在大规模数据集上的应用。
集成聚类[18,19],或称为共识聚类,通过融合来自多个基础聚类的信息,能够获得更好且更稳健的结果。集成聚类主要由基础聚类生成和共识函数分割组成。基础聚类是指单一聚类算法的划分结果,而共识函数则融合基础聚类生成最终的聚类结果。为了提高聚类结果的鲁棒性和准确性,需要确保基础聚类之间具有显著的差异。如果多个相同的基础聚类通过共识函数得到的结果,可能与单一的基础聚类等效,这违背了集成聚类的初衷。生成基础聚类的方法有很多,包括但不限于使用不同的聚类算法、相同聚类算法的不同参数和初始化、以及通过随机抽样获得不同的数据集进行聚类。基础聚类的聚类算法、参数和初始化方式不同,可以从不同角度反映数据集的内部结构信息,并对数据分布和噪声具有不同的敏感性。同时,共识函数用于融合丰富且互补的信息。因此,集成聚类能够提高聚类结果的准确性和稳定性,缓解单一聚类算法在初始化和参数敏感性以及只能处理特定结构数据集上的问题。
现有的大多数集成聚类算法[20–22]使用k-means算法生成基础聚类。尽管其时间复杂度较低,但由于k-means的局限性,这些算法在非线性可分数据集上的性能仍需要进一步改进。近年来,一些集成聚类算法[23–25]利用谱聚类生成基础聚类并取得了良好的效果,但其高复杂度限制了它们在大规模数据集上的应用。为了降低传统谱聚类的复杂度,一种广泛研究的策略是样本抽样[26,27]。Yan等人[26]首先运行k-means选择𝑝个代表点,然后对代表点进行谱聚类,最后将数据集中的样本划分为与最近代表点所属的簇相同的聚类。Shinnou和Sasaki[27]提出了一种新的抽样方法,运行k-means获取𝑝个代表点,然后去除靠近代表点的样本(预先定义距离阈值),并对剩余样本构建数据集进行谱聚类。尽管该策略显著提高了谱聚类的速度,但在抽样过程中会丢失大量的局部结构信息,导致聚类性能较差。另一种常用的策略是子矩阵近似。Chen等人[28]随机选择𝑝个样本作为锚点,构建一个大小为𝑁×𝑝的矩阵来近似相似度矩阵,然后通过执行特征值分解(EVD)获得特征向量。为了提高随机选择的稳定性,Cai和Chen[29]通过运行k-means获得𝑝个聚类中心,使用聚类中心作为锚点构建子矩阵,并最终通过奇异值分解(SVD)计算特征向量。此外,Huang等人[30]综合了上述两种算法,首先随机选择𝑝′(𝑝′>𝑝)个样本,然后在𝑝′个样本上运行k-means获得𝑝个聚类,并使用聚类中心作为锚点。然而,该算法在随机选择和k-means之间做了折衷,并没有消除随机性的影响。同时,在实际应用中,为了获得更好、更稳定的聚类结果,锚点的数量通常较大,因此时间复杂度仍然较高。集成聚类领域的另一个问题是需要生成多个不同的基础聚类。即使使用k-means等低复杂度算法,对于大规模数据集,运行时间仍然较长,严重限制了集成聚类处理大规模数据集的能力。尽管上述提到的U-SENC[30]可以处理大规模数据集,但它仍然需要多次运行谱聚类来获取基础聚类,聚类过程需要进一步加速。
为了解决集成聚类中的这些问题,本文提出了一种基于谱聚类的快速集成聚类算法,称为基于锚点的快速谱集成聚类(FSEC)。采用一种快速且稳定的锚点选择方法,并提出了一种快速的K-最近邻近似方法。为了减少谱聚类的时间和空间复杂度,构建了一个锚点图来近似相似度矩阵,并使用SVD替代EVD。更重要的是,该算法可以通过运行一次谱嵌入获得多个基础聚类,从而避免了多次运行谱聚类,显著减少了算法的运行时间。
总之,本文的主要贡献总结如下:
- 提出了一种快速的K-最近邻近似方法,显著减少了相似度矩阵构建的时间复杂度,从𝑁𝑝𝑑减少到𝑁𝐾𝑑,其中𝐾≪𝑝。
- 与其他基于谱聚类的集成聚类算法不同,所提算法通过运行一次谱嵌入即可获得多个基础聚类。
- 本文应用多种加速技术进行谱集成聚类,并提出了一种新的基于锚点的快速谱集成聚类算法。该算法的时间复杂度为 O(Npk),空间复杂度为 O(Np),非常适合处理大规模数据集。
- 在多个大规模数据集上进行了广泛实验,实验结果充分证明了所提算法在较短运行时间内获得了更好的聚类结果。
相关工作
2.1. 谱聚类
谱聚类算法来源于图论。它将数据集中的样本视为图中的顶点,并将样本之间的距离作为图中的权重。切割图时,最大化子图内的权重和,同时最小化子图之间的权重和,从而达到聚类的目的。对于具有𝑁个样本的数据集,谱聚类首先计算一个𝑁 × 𝑁的相似度矩阵,矩阵中的元素表示对应样本对之间的相似性。然后,对拉普拉斯矩阵进行特征值分解(EVD),以获取对应最小的𝑘个特征值的特征向量,实际上是对𝑁个样本的低维谱嵌入。最后,使用诸如k-means之类的离散化算法得到聚类结果。传统谱聚类的时间复杂度和空间复杂度分别为𝒪(𝑁²𝑘)和𝒪(𝑁²)。尽管在处理非线性可分数据集时具有明显优势,但高复杂度严重限制了谱聚类在大规模数据集和集成聚类中的应用。
一些算法通过子矩阵近似来避免计算𝑁 × 𝑁的相似度矩阵。Chen等人[28]随机选择𝑝个样本作为锚点,构建一个𝑁 × 𝑝的矩阵,图构建的时间复杂度为𝒪(𝑁𝑝𝑑)。虽然随机选择锚点的速度更快,但算法对所选锚点的质量依赖性很大,聚类效果不稳定(见图1(a))。为了增强算法的稳定性,Cai和Chen[29]通过k-means得到𝑝个锚点。该方法旨在消除与锚点选择相关的随机性(如图1(b)所示)。然而,k-means的时间复杂度为𝒪(𝑁𝑝𝑑𝑡),而图构建的时间复杂度为𝒪(𝑁𝑝𝑑),对于大规模数据集来说不可接受。为了加速k-means,Huang等人[30]首先随机选择𝑝′个样本,然后对𝑝′个样本运行k-means得到𝑝个锚点,并通过K近邻近似方法构建子矩阵。在这个算法中,k-means的时间复杂度为𝒪(𝑝²𝑑𝑡),图构建的时间复杂度为𝒪(𝑁𝑝^½𝑑),但仍需要随机选择样本,并未消除随机性。如图1(c)所示(根据原文中的实验设置,首先随机选择80个样本并运行k-means),可以看到所选的锚点并不具有代表性,为了获得更好的聚类结果,通常会将𝑝设置得更大,但𝒪(𝑝²𝑑𝑡)仍然不可忽视。
2.2. 锚图
对于具有𝑁个样本的数据集,传统基于图的聚类算法需要计算𝑁²对样本的相似性,即计算并存储𝑁 × 𝑁的相似度矩阵,当处理大规模数据集时,这是不现实的。为了解决上述问题,Liu等人[31]利用锚图替代相似度矩阵,从而减少计算资源和存储空间的需求。锚图通过以下公式构建:
𝑾 = 𝑩 \𝜦^{-1} 𝑩^⊤
其中,𝑩 ∈ 𝑅^{𝑁×𝑝},𝑏𝑖𝑗表示第𝑖个样本与第𝑗个锚点之间的相似度,𝜦是一个对角矩阵,其中𝛬𝑗𝑗 = ∑𝑖 𝑏𝑖𝑗。
2.3. 集成聚类
集成聚类通过结合多个基础聚类来获得更好且更稳定的聚类结果,因此受到了更多的关注。经过多年的发展,出现了大量的算法。根据共识函数,现有的算法主要分为三类:基于共现的算法、基于图的算法和基于中位数划分的算法。
基于共现的算法需要计算数据集的共现矩阵,即计算所有基础聚类中属于同一聚类的样本对的数量。可以将共现矩阵视为相似度矩阵,其中元素值越大,表示相应的样本对的相似度越高。通过使用一些基于相似度的聚类算法,可以得到最终的聚类结果。Fred 和 Jain [32] 利用证据积累的思想,通过在共现矩阵上使用层次聚合方法来获得聚类结果。Liu 等人 [21] 证明了加权 k-means 和谱聚类的等价性,并将其应用于共现矩阵,提出了谱集成聚类。
基于图的算法首先根据基础聚类的信息构建图,然后将图划分为一定数量的无连接子图,作为聚类结果。Strehl 和 Ghosh [33] 提出了三种基于图的集成聚类算法,CSPA、HGPA 和 MCLA,分别使用相似度度量、超图划分和元聚类的思想。Fern 和 Brodley [34] 从给定的基础聚类中构建了一个二分图,其中顶点表示样本和聚类,然后使用谱图划分或多级图划分来获得聚类结果。
与上述两种方法不同,基于中位数划分的方法将集成聚类问题转化为一个约束优化问题来求解。Li 和 Ding [35] 计算了来自基础聚类的相似度矩阵的加权和。然后,他们使用 Frobenius 范数作为目标函数来逼近指标矩阵,并获得聚类结果,而不需要其他聚类算法。
2.4. 快速集成聚类算法
经过多年的发展,研究人员提出了各种快速集成聚类算法。
在集成聚类领域,常用的加速策略是引入锚点。Liu 等人 [21] 使用加权 k-means 代替谱聚类来减少算法复杂度,但它仍然使用 k-means 生成基础聚类,因此聚类效果并不理想。Huang 等人 [30] 提出了混合代表选择策略,并使用转移切割加速相似度矩阵的划分。然而,混合策略仍未消除随机性的影响。Yang 等人 [36] 在锚点上执行谱聚类,然后将样本划分到最近的锚点聚类中。本文主要致力于降低空间复杂度,并直接对锚点进行聚类,但忽略了局部结构信息。基于 [30,37],进一步通过重用锚点图和引入轻量级 k-means 加速了聚类过程。Liang 等人 [38] 首先利用低秩约束和锚点来获得鲁棒的相似度矩阵,然后使用谱聚类来获取聚类结果。然而,它直接对锚点进行聚类,忽略了数据集的局部结构信息,聚类效果较差。
多视图聚类也面临着处理大规模数据集困难的问题。Kang 等人 [39] 在每个视图上学习小规模的图,然后将它们融合成一个线性时间复杂度的单一图。然而,它多次使用 k-means 查找锚点,且在大规模数据集上的运行时间仍然较长。Sun 等人 [40] 将锚点学习和图构建结合成统一的优化框架,以提高所选锚点的质量,时间复杂度仅为线性。此外,Zhao 等人 [41] 专注于不完全多视图聚类问题,使用视图间二分图来指导视图内二分图的自我完成。Yin 和 Sun [42] 通过重构不完整的视图来发现潜在表示。Huang 等人 [43] 使用混合代表选择策略和转移切割方法加速了每个单一视图的谱聚类过程。更重要的是,算法提出了一种多阶段混合策略来提高聚类的准确性。
虽然上述算法有效地加速了集成聚类过程,但该领域仍有许多问题需要解决。首先,锚点选择方法需要进一步改进。现有的方法可以分为 k-means 选择、随机选择和混合代表选择。在这些方法中,k-means 选择产生的锚点质量较高,但会产生显著的时间成本。另一方面,随机选择和混合选择策略具有较低的时间复杂度,但引入的随机性通常会导致锚点质量较差,从而影响聚类性能。其次,构建相似度矩阵的时间复杂度较高。大多数方法计算所有样本与其𝐾个最近锚点之间的距离,但未能高效利用锚点的特性,导致了大量的时间成本。第三,生成基础聚类的过程较为繁琐。为了增强基础聚类之间的多样性并改善聚类效果,现有的算法通常需要多次运行谱聚类并调整不同的参数。即使是改进后的谱聚类,在大规模数据集上的运行时间依然不可接受。
为了解决这些问题,作者提出并实现了一系列加速方法。对于锚点选择问题,引入了一种基于平衡 k-means 的层次 k-means 方法,能够在较短的时间内高效地识别高质量的锚点。为了改进相似度矩阵的构建,开发了一种 K-最近邻快速近似方法,该方法充分利用了锚点的特性,显著加快了处理速度。对于基础聚类的生成,算法采用一次谱嵌入运算,随后进行多次 k-means 运算,从而生成多样化的基础聚类。这种方法不仅简化了生成过程,还显著降低了时间复杂度。
模型
FSEC 的整体框架(见图 2)。
3.1 构建锚点图
3.1.1 锚点选择
对于包含 N 个样本的数据集,传统的谱聚类需要构建 N×N 的相似度矩阵来挖掘数据集的内部结构。图的构建时间复杂度高达 O(N2d),空间复杂度为 O(N2),对于大规模数据集来说是不可行的。为了扩展谱聚类在大规模数据集上的应用,常用的策略是基于锚点的子矩阵近似,这主要包括两个步骤:锚点选择和子矩阵构建。在这种策略中,锚点的质量对聚类结果具有至关重要的影响。随机选择锚点速度较快,但无法保证锚点的质量,导致聚类效果较差。基于 k-means 的选择策略在给定数据集上运行 k-means 算法,并使用聚类中心作为锚点。高质量的锚点能够改善聚类效果,但 k-means 的时间复杂度为 O(Npdt),这在一定程度上增加了谱聚类的时间开销和计算负担。混合代表选择策略在随机选择和 k-means 之间进行平衡,首先随机选择 p′(p′>p)个样本,然后在 p′个样本上运行 k-means 算法生成 p 个聚类,并将聚类中心作为锚点。其时间复杂度为 O(p′2dt)。尽管混合代表选择策略减少了 k-means 策略的时间复杂度,但它并未完全消除随机性的影响,因此无法保证得到最具代表性的高质量锚点。
与上述方法不同,作者参考了平衡 k-means 基层次 k-means 算法(BKHK)[44],该算法能够快速获得给定数据集的高质量锚点。如图 3 所示,BKHK 借鉴了平衡二叉树结构,并采用分治思想加速 k-means 算法。在 BKHK 中,每次迭代将当前样本分成两个子集,每个子集的样本数量相同,直到子集的数量等于数据集中的聚类数为止,迭代停止。其时间复杂度为 O(Nlog(p)dt)。利用 BKHK 将数据集划分为 p 个聚类,并计算聚类中心作为锚点。图 1(d) 显示了 BKHK 在玩具数据集上的锚点选择效果。
3.1.2 图构建
在获得锚点后,谱聚类计算所有样本与其 K-最近锚点之间的相似度,以构建相似度矩阵。具体来说,谱聚类首先计算 N 个样本与 p 个锚点之间的距离,得到 N×p的子矩阵,然后保留每一行的最大 K 个元素,并将其余元素置为 0,以稀疏化相似度矩阵。其时间复杂度和空间复杂度分别为 O(Npd),需要进一步优化。
充分利用锚点的特性,提出了一种 K-最近邻快速近似方法来加速相似度矩阵的构建。锚点是数据集不同区域中样本的代表性点,锚点之间的距离与锚点区域内的样本与其余锚点之间的距离非常相似。基于这一点,可以使用样本所属锚点的邻近锚点来减少其 K-最近邻的选择范围。
在高效近似过程中,最关键的步骤是存储每个锚点的 K-最近锚点。具体来说,对于锚点 aj,首先计算它与其他锚点的距离,然后按升序排序这些距离,最后选择距离最小的 K′个锚点作为 K-最近锚点。获得所有锚点的 K-最近锚点后,可以执行快速近似方法来获取样本的 K-最近锚点。对于样本 xi,可以按照图 4 的步骤获取它的 K-最近锚点:
- 在运行 BKHK 方法时,找到样本 xi 所属于的锚点 aj。
- 选择锚点 aj 的最近的 K′ (K′>K) 个锚点作为候选锚点,这里将 K′=10K以增加快速近似方法的鲁棒性。
- 计算并排序样本 xi与其候选锚点之间的距离。
- 使用最近的 K个锚点作为样本 xi的 K-最近锚点。
在提出的方法中,计算锚点之间的距离并排序的时间复杂度为 O(p2d+p2log(p)),计算样本与邻近锚点之间的距离并排序的时间复杂度为 O(NKd+NKlog(K))。
接下来,需要构建样本与其 K-最近锚点之间的相似度矩阵。大多数传统算法使用基于核的方法,例如高斯核,但它引入了额外的参数 σ,且需要调整参数值以获得更好的聚类结果。作者使用[45]中的方法来避免调参过程。样本 xi与其 K-最近锚点之间的相似度可以通过求解以下优化问题得到:
3.2. 生成基础聚类
3.2.1. SVD
谱聚类的一般形式为
其中,F是指示矩阵,L=D−W是拉普拉斯矩阵,D是对角矩阵,其对角元素为dii=∑jwij。
根据公式(1)和(3),可以证明W是双重随机的。由于W的行和为1,因此D=I,问题(4)可以转化为
上述问题的解是W对应的最大k个特征值的特征向量,但特征值分解(EVD)的时间复杂度过高。因此,改为使用更快速的SVD方法。根据公式(1),可以得到
其中,U是左奇异向量,V是右奇异向量,Σ是奇异值。可以证明,当Σ对角线上的值按降序排列时,U中的前k列向量等同于W的最大特征值对应的特征向量,即F。可以将F的行向量视为样本,然后运行k-means算法来获得聚类结果。
3.2.2. k-means
一些谱集成聚类算法通过多次运行谱聚类并设置不同类别来获得基础聚类,例如U-SENC,以增加基础聚类的多样性。它多次选择锚点以构建多个相似性矩阵。然后,它运行快速近似谱聚类算法以获得多个基础聚类,显著增加了U-SENC的时间复杂度。然而,具有不同类别数的基础聚类完全满足集成聚类对基础聚类多样性的要求,而且无需多次选择锚点来增加多样性。因此,只选择锚点,构建相似性矩阵,并执行SVD一次。为了减少时间复杂度,执行SVD时不需要求解所有特征值,只需满足第四节中基础聚类的最大类别数,因此U的大小可以表示为RN×min(50,N)。在获得左奇异向量矩阵U后,选择左侧的ci列向量(ci在设定范围内随机选择),运行k-means算法,并使用聚类结果作为基础聚类πi。此过程重复多次,得到基础聚类集
3.3. 二分图划分
3.3.1. 二分图构建
获得多个基础聚类后,通过引入二分图进行共识函数划分,得到最终的聚类结果。
基础聚类πi包含ci个聚类,那么m个基础聚类中的所有聚类集合为
使用样本X和聚类Y作为顶点来构建二分图,即G={X,Y,B~}, ,其中B是相似性矩阵,衡量X和Y之间的相似性。
3.3.2. 共识函数划分
在执行共识函数划分之前,B~需要转化为完整的相似性矩阵,即
它衡量N+C个样本之间的相似性。
根据谱聚类,通过求解以下特征问题来划分图E[46]:
其中,拉普拉斯矩阵。使用EVD求解问题(12)的时间复杂度为O((N+C)3),对于大数据集来说是不可行的。
为了减少共识划分的时间复杂度,参考[47]使用转移切割。具体来说,利用二分图的特殊结构,求解问题(12)中的N+C个样本的特征问题,简化为求解C个样本的特征问题。新的简化图为G~={Y,E~},其中Y是锚点集合,,
是对角矩阵。
G~的特征问题可以表示为
[47]证明了问题(12)和问题(13)的等价性,并给出了f和u之间的关系:
求解问题(13)的时间复杂度为O(C3)。获得u后,可以使用公式(14)计算f,从而避免直接求解问题(12)。在此,选择对应于最小k个特征值的特征向量,形成大小为(N+C)×k(的新矩阵。前N行向量对应数据集中的N个样本,可以在这些样本的前N行向量上使用k-means算法得到最终的聚类结果。
实验
聚类结果的比较见表3到表5,运行时间的比较见表6,其中 N/A 表示由于内存不足,相关算法无法运行。在本节中,运行时间包括基聚类生成和共识函数划分。
通过比较,得出以下结论:
• FSEC 在大多数大规模数据集上取得了最好的聚类结果,特别是在 Covertype 和 MNIST 数据集上,ACC 相比次优结果提高了 18% 和 5%。
• 与基于 k-means 的集成聚类算法相比,FSEC 使用谱聚类生成基聚类,同时引入了 K 最近邻近似、锚点图等方法,显著降低了算法的时间复杂度。大规模数据集上运行时间的比较也有力地证明了 FSEC 的高效性。
• 在比较的算法中,U-SENC、LSEC 和 LiteWSEC 是适用于大规模数据集的快速集成聚类算法,与其他算法不同,它们的基聚类是通过谱聚类生成的。它们在实验数据集上实现了最优或次优的聚类结果,表明基于谱聚类的集成聚类算法在处理非线性可分数据集时更具优势。
• 与 LSEC 和 LiteWSEC 相比,FSEC 在相似或更短的运行时间内能够获得更好的聚类结果,证明提出的加速策略在谱集成聚类算法中是有效的。在某些数据集上,FSEC 的运行时间为次优。一个原因是 LSEC 和 LiteWSEC 在聚类时使用了更快的 lite-k-means,最大迭代次数设置为 10,而作者的算法使用 k-means 进行聚类,最大迭代次数为 100。
为了更清楚地说明所提算法的效率,作者记录了算法每一步的具体运行时间,结果见表7。可以看出,基聚类生成占用了谱集成聚类算法大部分的运行时间,这与本文从基聚类生成开始加速算法是一致的。
此外,为了说明所提算法与比较方法之间的差异,作者多次运行了所提算法和每种比较方法,得到了两组标准化互信息(NMI)值。然后,作者进行了 t 检验分析,以评估两组结果之间的显著差异。对于 t 检验方法,原假设是两种方法得到的聚类结果没有显著差异,而备择假设是存在显著差异,意味着所提算法与比较方法之间存在差异。
实验结果见表8。这里,𝑝-value 表示假设原假设为真时,观察到给定结果的概率。假设检验结果用 ℎ 表示,表明是否可以在显著性水平 𝛼 = 0.05 下拒绝原假设:ℎ = 0 表示无法拒绝原假设,ℎ = 1 表示拒绝原假设并接受备择假设。𝑝-value 和 ℎ 明确展示了所提算法与比较方法之间的显著差异。
重点在于锚点图的构建与二分图的划分。。
相关文章:
【论文阅读】Anchor-based fast spectral ensemble clustering
论文地址:Anchor-based fast spectral ensemble clustering - ScienceDirect 代码地址: 摘要 集成聚类通过融合多个基础聚类方法,可以获得更好且更稳健的结果,因此受到广泛关注。尽管近年来已经出现了许多代表性的算法ÿ…...
asp.net core 发布到iis后,一直500.19,IIS设置没问题,安装了sdk,文件夹权限都有,还是报错
原因就是没有安装ASP.NET Core 9.0 Runtime (v9.0.0) - Windows Hosting Bundle,我是只安装了.net core的sdk,下面介绍下sdk和hosting bundle的关系 在 .NET Core 和 ASP.NET Core 的开发中,SDK(Software Development Kit&#x…...
牛客月赛108
目录 A. 小S按按钮 C. 小T数星星 E. 小M种树 A. 小S按按钮 (1) 二分答案的右边界一定要开大。若 x 等于 0,最多 2 * y 次 (2)根据是要最小还是最多,调整 if ( check ( mid ) ) 里的是 l 还是 r #include&l…...
QML自定义进度条和单选按钮的样式
1.自定义进度条的样式 1.1代码展示 import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.1Window {visible: truewidth: 640height: 480title: qsTr("Hello World")ProgressBar {id: myProgressvalue: 0.5padding: 2anchors.centerIn: parent…...
jetbrain 安装 copilot
问题一:Sign in failed. Reason: Request signInInitiate failed with message: Request to /github.com/login/device/code> timed out after 30000ms, request id: 11, error code: -32603 解决方案: 参考资料:https://github.com/orgs/…...
FPGA 4x4矩阵键盘 实现
1原理 FPGA(现场可编程门阵列)4x4矩阵键盘的实现原理主要基于行列扫描法,通过FPGA对键盘的扫描和识别,实现对键盘输入信号的采集和处理。以下是对FPGA 4x4矩阵键盘实现原理的详细解释: 一、矩阵键盘的基本原理 结构:4x4矩阵键盘由4行和4列组成,共16个按键。每个按键位…...
探索 JMeter While Controller:循环测试的奇妙世界
嘿,宝子们!今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器,它就像是一把神奇的钥匙,能帮我们打开循环测试的大门,模拟出各种各样复杂又有趣的场景哦! 一、While 控制器初印象 想象一下,你…...
Facebook元宇宙项目中的智能合约应用:提升虚拟空间的自治能力
近年来,Facebook在元宇宙领域的探索引起了广泛关注。元宇宙是一个融合虚拟现实(VR)、增强现实(AR)和互联网的沉浸式数字空间。在这个过程中,智能合约技术被认为是提升虚拟空间自治能力的关键工具。通过自动…...
前后端规约
文章目录 引言I 【强制】前后端交互的 API请求内容响应体响应码II 【推荐】MVC响应体III【参考】IV 其他引言 服务器内部重定向必须使用 forward;外部重定向地址必须使用 URL 统一代理模块生成,否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”,并且还会带来 URL 维护…...
获取 Astro Bot AI 语音来增强您的游戏体验!
有很多用户尝试过Astro Bot,却被Astro Bot可爱的声音所吸引。您是否想知道如何使用 Astro Bot 语音来拨打恶作剧电话或用他的声音说话?如果您有,那么这篇文章适合您。我们将向您展示如何为 Astro Bot 提供逼真的 AI 声音并在在线对话中使用它…...
javaEE-多线程进阶-JUC的常见类
juc:指的是java.util.concurrent包,该包中加载了一些有关的多线程有关的类。 目录 一、Callable接口 FutureTask类 参考代码: 二、ReentrantLock 可重入锁 ReentrantLock和synchronized的区别: 1.ReentantLock还有一个方法:…...
nginx配置 - 资源参数配置(性能优化)
nginx - 资源参数配置 (性能优化) 一、worker_rilimit_nofile配置的含义使用场景如何调整参数系统级文件描述符限制(补充)二、worker_connections三、两者之间的数值关系四、sendfile五、keepalive_timeout本文重点讨论: 最大文件描述符数量 worker_rilimit_nofile和最大连…...
TiDB 升级至高版本提示'mysql.tidb_runaway_watch' doesn't exist 问题处理
作者: asd80703406 原文来源: https://tidb.net/blog/90394c97 背景 近期发现很多人从低版本升级至TiDB v7 或者v8版本,均遇到了tidb-server启动失败,提示报错如下: ["get runaway watch record failed"…...
利用Deeplearning4j进行 图像识别
目录 图像识别简介 神经网络 感知器 前馈神经网络 自动编码器 受限玻尔兹曼机 深度卷积网络 理解图像内容以及图像含义方面,计算机遇到了很大困难。本章先介绍计算机理解图像教育方面 遇到的难题,接着重点讲解一个基于深度学习的解决方法。我们会…...
使用Python构建智能医疗诊断系统
医疗诊断系统在现代医疗领域中扮演着重要角色,尤其在辅助医生进行初步诊断、缩短诊断时间方面更是发挥了显著作用。借助Python强大的数据处理能力和机器学习工具,我们可以构建一个智能医疗诊断系统。本文将详细介绍实现过程,并结合代码示例帮助您理解。 引言 现代医学产生…...
NLP 技术的突破与未来:从词嵌入到 Transformer
在过去的十年中,自然语言处理(NLP)经历了深刻的技术变革。从早期的统计方法到深度学习的应用,再到如今Transformer架构的普及,NLP 的发展不仅提高了模型的性能,还扩展了其在不同领域中的应用边界。 1. 词嵌…...
【2024年-11月-9日-开源社区openEuler实践记录】OpenAMDC:开启智能边缘计算与系统管控的新征程
一、开篇:邂逅 OpenAMDC 大家好,我是 fzr123,在开源项目的浩瀚天地里持续探索,今天要带大家深入了解一项极具前瞻性与创新性的开源成果——OpenAMDC。在边缘计算蓬勃兴起、系统复杂度与日俱增的时代背景下,OpenAMDC 宛…...
ELK日志平台搭建 (最新版)
一、安装 JDK 1. 下载 JDK 21 RPM 包 wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.rpm2. 安装 JDK 21,使用 rpm 命令安装下载的 RPM 包: sudo rpm -ivh jdk-21_linux-x64_bin.rpm3. 配置环境变量 编辑 /etc/profile 文件以配置 JAVA_HO…...
蓝桥杯备赛:C++基础,顺序表和vector(STL)
目录 一.C基础 1.第一个C程序: 2.头文件: 3.cin和cout初识: 4.命名空间: 二.顺序表和vector(STL) 1.顺序表的基本操作: 2.封装静态顺序表: 3.动态顺序表--vector:…...
MySQL数据库——常见慢查询优化方式
本文详细介绍MySQL的慢查询相关概念,分析步骤及其优化方案等。 文章目录 什么是慢查询日志?慢查询日志的相关参数如何启用慢查询日志?方式一:修改配置文件方式二:通过命令动态启用 分析慢查询日志方式一:直…...
【NX入门篇】
NX入门篇 一、UG NX 由来二、软件如何启动(UG NX 12.0)三、使用步骤四、常用命令 一、UG NX 由来 UG NX由来: 1969 年:UG 的开发始于美国麦道航空公司,基于 C 语言开发实现;1976 年:UG问世&am…...
卡码网 ACM答题编程模板
背景: input() 在 ACM 编程中的底层调用原理 1. input() 的核心原理 在 Python 中,input() 的底层实现依赖于标准输入流 sys.stdin。每次调用 input() 时,Python 会从 sys.stdin 中读取一行字符串,直到遇到换行符 \n 或文件结束…...
vue代理问题
vue代理问题 场景:前后端分离项目问题,在前端中请求接口,返回数据这个过程,但是在这个过程中,前端会有两个环境,一个是开发环境,一个是生产环境. 在开发环境中请求接口可能会遇到跨域问题,比如请求的端口是3000,当前端口是8080,这时候就会遇到跨域问题,或者ip不同,也会存在跨…...
软考 高级 架构师 第十 章软件工程3
1.系统测试 系统测试是为了发现错误而执行程序的过程,成功的测试是发现了至今尚未被发现的错误的测试。 测试原则: 1)应尽早并不断的进行测试 2)测试工作应避免由原开发软件的人或小组承担 3)在 设计测试方案时&#…...
GoF23种设计模式 简介
文章目录 面向对象(OO)设计原则(7)单一职责原则开闭原则里氏代换原则依赖倒转原则接口隔离原则合成复用原则迪米特法则 创建型模式 (5)工厂方法模式 (类模式,其余都是对象模式)抽象工厂模式建造…...
【FlutterDart】页面切换 PageView PageController(9 /100)
上效果: 有些不能理解官方例子里的动画为什么没有效果,有可能是我写法不对 后续如果有动画效果修复了,再更新这篇,没有动画效果,总觉得感受的丝滑效果差了很多 上代码: import package:flutter/material.…...
旧服务改造及微服务架构演进
旧服务改造及微服务架构演进 微服务架构演进1.微服务架构2.微服务架构的特点3.单体架构与微服务架构之间的对比4.微服务架构演进历程 旧服务改造1. 微服务拆分的一些通用原则2.微服务拆分策略(1)功能维度拆分策略(2)非功能维度拆分…...
数据结构复习 (顺序查找,对半查找,斐波那契查找,插值查找,分块查找)
查找(检索): 定义:从给定的数据中找到对应的K 1,顺序查找: O(n)的从前向后的遍历 2,对半查找,要求有序 从中间开始查找,每次检查中间的是否正确,不正确就…...
根据docker file 编译镜像
比如给到一个Dockerfile 第一步编译镜像 cd /path/to/Dockerfiledocker build -t <DOCKER_IMAGE_NAME> . build 命令编译镜像 -t 镜像名字 . 指dockerfile 所在目录 如果遇到报错 [] Building 0.3s (3/3) FINISHED …...
C语言:调试的概念和调试器的选择
所谓调试(Dubug),就是跟踪程序的运行过程,从而发现程序的逻辑错误(思路错误),或者隐藏的缺陷(Bug)。 在调试的过程中,我们可以监控程序的每一个细节ÿ…...
Vulnhub靶场(Earth)
项目地址 https://download.vulnhub.com/theplanets/Earth.ova.torrent 搭建靶机 官网下载.ova文件双击vm打开导入 获取靶机IP kail终端输入 arp-scan -l 获取靶机 IP 192.168.131.184 信息收集 端口扫描 sudo nmap -sC -sV -p- 192.168.131.184 可以看到开启22端口&…...
rsync命令常用同步方案
rsync是一个高效的文件同步工具,广泛应用于本地和远程备份、镜像及同步任务。它通过增量同步、压缩传输以及远程协议(如SSH)等技术,显著提高了文件传输的效率。本文将介绍rsync命令的常用参数、工作原理、常见同步方案,…...
【Ubuntu】 Ubuntu22.04搭建NFS服务
安装NFS服务端 sudo apt install nfs-kernel-server 安装NFS客户端 sudo apt install nfs-common 配置/etc/exports sudo vim /etc/exports 第一个字段:/home/lm/code/nfswork共享的目录 第二个字段:指定哪些用户可以访问 * 表示所有用户都可以访…...
Python自学 - 递归函数
1 Python自学 - 递归函数 递归函数是一种在函数体内调用自己的函数,就像“左脚踩着右脚,再右脚踩着左脚… 嗯,你就可以上天了!”。递归函数虽然不能上天,但在处理某些场景时非常好用, 一种典型的场景就是遍…...
后端开发入门超完整速成路线(算法篇)
引言 后端开发是软件开发中不可或缺的一部分,它涉及到服务器、数据库、API等核心组件的构建和维护。对于初学者来说,掌握算法和数据结构是进入后端开发领域的基础。本文将为你提供一个超完整的算法学习路线,帮助你快速入门,并在文…...
51单片机——共阴数码管实验
数码管中有8位数字,从右往左分别为LED1、LED2、...、LED8,如下图所示 如何实现点亮单个数字,用下图中的ABC来实现 P2.2管脚控制A,P2.3管脚控制B,P2.4管脚控制C //定义数码管位选管脚 sbit LSAP2^2; sbit LSBP2^3; s…...
使用Clion在ubuntu上进行交叉编译,并在Linux上远程编译五子棋
目录 1.工具以及概念介绍 (1)Clion软件简介 (2)交叉编译 (3)远程编译 2.操作原理 3.详细操作步骤 (1)配置Clion与虚拟机ubuntu的ssh连接 CLion远程开发Ubuntu,并显…...
高并发写利器-组提交,我的Spring组件实战
高并发写优化理论 对于高并发的读QPS优化手段较多,最经济简单的方式是上缓存。但是对于高并发写TPS该如何提升?业界常用的有分库分表、异步写入等技术手段。但是分库分表对于业务的改造十分巨大,涉及迁移数据的麻烦工作,不会作为…...
Stable Diffusion的简单介绍
Stable Diffusion 是一款免费、开源的 AI 图像生成器,由 Stability AI 公司于 2022 年 8 月推出1。以下是关于它的详细介绍: 目录 工作原理 特点 应用场景 主要版本 工作原理 Stable Diffusion 属于潜在扩散模型,主要由三部分组成&…...
R语言的数据结构
R语言的数据结构 R语言是专门为统计计算和数据分析而设计的一种编程语言,因其强大的数据处理能力而受到广泛欢迎。在R中,数据结构是理解和有效使用R语言的基础。本文将详细介绍R语言中的主要数据结构,包括向量、矩阵、数据框、列表、因子等&…...
go项目zero框架中用gentool解决指定MYSQL表生成结构体被覆盖的解决方案
在使用 GoZero 框架进行项目开发时,gentool 是一个非常方便的工具,它可以根据数据库表结构自动生成 Go 语言结构体和其他相关文件。然而,在使用 gentool 生成结构体时,可能会遇到一个问题:如果多次运行 gentool&#x…...
限时特惠,香港服务器,低至53元/年
家人们谁懂啊!香港服务器这价格简直逆天了,居然比内地的还便宜!就拿阿里云来说,人家最低配置的服务器,价格都很难做到这么亲民。 最低配的就不说了,2 核 4G 的配置,应对日常业务稳稳当当&#x…...
【GUI-pyqt5】QObject类
1. QObject模块详解 1.1 描述 所有Qt对象的父类 1.2 功能和作用 1.2.1 对象名称和属性 1.2.1.1 API API功能备注 setObjectName("唯一名称") 给一个Qt对象设置一个名称 一般这个名称是唯一的,当做对象ID来使用 objectName() 获取一个对象名称 - set…...
第2章:SQL基础
第2章:SQL基础 2.1 SQL语言介绍 2.1.1 SQL发展历史 SQL的起源SQL标准的演变不同数据库的SQL实现 2.1.2 SQL语言分类 数据定义语言 (DDL):用于定义和修改数据库的结构,包括数据库、表、索引、视图等对象的创建、修改和删除。数据操作语言 (DML):用于…...
Azkaban其一,介绍、体系架构和安装
目录 一、简介 二、Azkaban的体系结构 三、Azkaban的安装步骤 1、上传,解压 2、生成mysql的元数据 3、配置web-server 4、配置exec-server 5、修改所有的.sh 的执行权限 一、简介 遇到了什么问题才会使用Azkaban ?比如: 想启动hadoop集群先启动…...
Seata 使用教程:全面解锁分布式事务管理
Seata 使用教程:全面解锁分布式事务管理 在当今分布式系统蓬勃发展的时代,微服务架构被广泛应用,随之而来的是分布式事务管理的难题。Seata 作为一款开源的分布式事务解决方案,为保障分布式系统的数据一致性提供了强有力的支持。本文将详细讲解 Seata 的使用方法,深入剖析…...
《learn_the_architecture_-_aarch64_exception_model》学习笔记
1.当发生异常时,异常级别可以增加或保持不变,永远无法通过异常来转移到较低的权限级别。从异常返回时,异常级别可能会降低或保持不变,永远无法通过从异常返回来移动到更高的权限级别。EL0级不进行异常处理,异常必须在比…...
密码学原理技术-第十一章-Hash Functions
文章目录 总结Why we need hash functionsDigital Signature with a Hash FunctionBasic Protocol for Digital Signatures with a Hash FunctionPrincipal input–output behavior of hash functions Security propertiesThe three security requirements of hash functionsWh…...
Golang 入门基础知识
快速入门 go 语言笔记,参考了各种大佬的 blog 。 一、下载安装 国内站点 :https://golang.google.cn IDE : Goland (2020.12月以后破解有些困难 见 zhile.io, 无法试用的话可以搜一个注册码,失效的也可以&…...
SQL把字符串按逗号分割成记录
在 SQL 中,可以通过以下方法将字符串按逗号分割,并将每个分割的值作为单独的记录插入到结果集中。以下是针对不同数据库系统的实现方法: 1. 使用 STRING_SPLIT(SQL Server 2016) STRING_SPLIT 是 SQL Server 提供的内置…...