news 2026/4/4 3:52:34

掌握 t-SNE:Python 中理解和实现的全面指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
掌握 t-SNE:Python 中理解和实现的全面指南

原文:towardsdatascience.com/mastering-t-sne-a-comprehensive-guide-to-understanding-and-implementation-in-python-480929bfe6f4

如果要训练鲁棒的机器学习模型,需要具有许多维度的大数据集来识别足够多的结构并给出最佳可能的预测。然而,这样高维度的数据难以可视化和理解。这就是为什么需要降维方法来可视化复杂的数据结构并进行分析。

t-Distributed Stochastic Neighbor Embedding (t-SNE/tSNE) 是一种基于数据点之间距离的降维方法,它试图在较低维度中保持这些距离。它来自 无监督学习 领域,并且也能够分离非线性数据,即不能通过直线划分的数据。

为什么需要降维?

各种算法,如 线性回归,如果数据集中包含相关(即相互依赖)的变量,就会存在问题。为了避免这个问题,从数据集中移除与另一个变量相关的变量是有意义的。然而,同时,数据不应失去其原始信息内容或应尽可能保留信息。

相关性与因果关系的区别

另一个应用是聚类分析,例如 k-means 聚类,在这种情况下,我们必须预先定义簇的数量。降低数据集的维度有助于我们获得信息的第一印象,例如,能够估计哪些是最重要的变量以及数据集可能有多少个簇。例如,如果我们能够将数据集降低到三维,我们就可以在图表中可视化数据点。然后可以从这里读取簇的数量。

此外,具有许多变量的大数据集也存在着模型 过拟合 的风险。简单来说,这意味着模型在训练过程中过度适应训练数据,因此对新数据、未见数据只能提供较差的结果。例如,对于神经网络来说,因此,首先使用最重要的变量训练模型,然后逐步添加可能进一步提高模型性能而不导致过拟合的新变量是有意义的。

t-SNE 的基本原理是什么?

t-Distributed Stochastic Neighbor Embedding 基于几个基本概念,以下将更详细地解释这些概念,以帮助您理解算法的基本特性:

相似度度量:使用距离度量来可视化数据点之间的相似度,这些度量衡量两个点之间的距离。通常使用欧几里得距离,其中两个点的坐标在所有维度上的差异被形成。然后,这些差异被平方并相加。除了计算距离之外,还可以使用其他相似度度量,例如余弦相似度。两个向量之间的角度决定了它们的相似程度。夹角越小,数据点越相似。

概率分布:t-SNE 使用两种概率分布。在高维空间中,尝试将所有数据点放置在高斯正态分布上。一个数据点位于钟形曲线的中心,而数据集中的其余点根据它们与该点的距离放置在高斯正态分布上。一个点越接近选定的数据点,它就越接近钟形曲线的中心。

另一方面,在低维空间中,使用的是 t 分布,它与正态分布相似,但边缘略高,因此中心略低。t-SNE 算法旨在找到一种方法,将高维空间中的高斯分布转换为低维空间中的 t 分布,同时尽可能少地丢失信息。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/36c7c8cebd8e2f198144b909b5dc322f.png

t 分布与高斯正态分布的区别 | 来源:作者

  • 嵌入函数:为了完成算法,创建了一个嵌入函数,它使得高维空间中的数据点可以映射到低维空间中的点。高维空间中的每个点在低维空间中分配了唯一的一个点。

这些基本原则构成了对 t-SNE 算法良好理解的基础。

t-SNE 背后的想法是什么?

将高维数据集转换为低维数据集,同时尽可能保留数据集中的信息,这并不容易。以下图展示了一个简单的二维数据集,总共有 50 个数据点。可以识别出三个不同的簇,它们彼此之间也很好地分离。黄色簇距离其他两个簇最远,而紫色和蓝色数据点彼此更近。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dc5be01295459471737b19e0d7b27c5c.png

t-SNE 的二维数据 | 来源:作者

现在的目标是将这个二维数据集转换为低维,即一维。为此,最简单的方法是只通过其 X 或 Y 坐标来表示数据。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d1bc8949dc10ae163ad5a454a2fcad15.png

通过 X 或 Y 坐标进行降维 | 来源:作者

然而,很明显,这种简单的转换已经丢失了数据集的大部分信息,并且与原始二维数据给出了不同的图像。

如果只使用 X 坐标,看起来黄色和紫色簇重叠,并且三个簇彼此大致等距。另一方面,如果只使用 Y 坐标进行降维,黄色簇与其他簇的分离更好,但看起来紫色和蓝色簇重叠。

t-SNE 的基本思想是将高维度的距离尽可能转移到低维度。为此,它使用随机方法,并将点之间的距离转换为表示两个随机点彼此相邻可能性的概率。

更精确地说,这是一个条件概率,表示一个点选择另一个点作为邻居的可能性有多大。因此得名“随机邻域嵌入”。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3de99f82862fb8d88f6616bdc4bc0a2a.png

根据 t-SNE 进行降维 | 来源:作者

如您所见,这种方法导致了一个结果更好,其中三个不同的簇可以清楚地相互区分。很明显,黄色数据点与其他数据点显著更远,蓝色和紫色簇彼此之间也稍微靠近一些。

t-SNE 算法是如何工作的?

在第一步中,t-SNE 算法计算所有点的高斯概率分布。这表示两个随机选择的点成为邻居的可能性有多大。高概率表示两个点彼此靠近,而低概率表示点之间距离较大。

对于任何给定的黄色数据点,这个分布可能看起来像下面的图。其他黄色数据点与所选点非常接近,因此有很高的概率成为所选点的邻居。蓝色和紫色点部分具有相似的距离,因此它们重叠。然而,它们成为邻居的可能性显著较低,因此它们在正态分布上更靠外。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/bc33c0e95fe422df614562ead3e7969f.png

t-SNE 中数据点的高斯分布 | 来源:作者

描述 t-SNE 的第一篇论文也指出,一个点到它自己的条件概率被定义为零。因此,数据点位于图的起点,因为这个点不能是它自己的邻居。

从数学上讲,这个曲线表示两个点𝑥𝑗和𝑥𝑖相邻的条件概率。这是 t-SNE 的第一部分,即“随机邻域嵌入”,其中两个点的邻域可以用概率来表示。这个概率可以使用以下公式来计算:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/82d7d54de1c8a5820dfe63a30c4ee361.png

各个参数的具体含义如下:

  • 𝑝(𝑗|𝑖):这代表点𝑥𝑖在高度空间中选择点𝑥𝑗作为其直接邻居的概率。

  • 𝑥𝑖和𝑥𝑗是高维空间中的两个数据点。

  • ‖‖𝑥𝑖–𝑥𝑗‖‖是两个点之间的距离。通常使用欧几里得距离,但可以使用任何想要的距离度量。

  • 分子是这个公式中最复杂的一部分,被称为高斯核函数。这确保了曲线的钟形形状,并且最重要的是,使得距离成为介于 0 和 1 之间的概率。否则,距离的值将始终取决于数据集所在的尺度。点𝑥𝑖的标准差取决于所谓的困惑度,它决定了模型是否应该更多地关注近邻点的正确映射或远点之间的距离。这个参数将在下一节中更详细地讨论。

  • 分母代表点𝑥𝑙与数据集中所有其他数据点以及点𝑥𝑙本身的条件概率之和。它被这个项除,以确保点𝑥𝑖与数据集中所有其他数据点之间的条件概率之和等于一。没有这个归一化项,分布将看起来像之前的图表。然而,这里的问题是所有数据点的概率之和大于 1。这个特性确保获得了一个可解释的概率分布。

在将这个条件概率适应到高维数据空间之后,接下来尝试将其转移到低维数据空间,以便条件概率尽可能相似。使用传统的“学生邻域嵌入”,现在将尝试将条件概率转换成低维空间中新的高斯分布,使其尽可能接近。然而,t-SNE 中的“t”代表所谓的 t 分布,这在基本原理部分已经提到过。

t 分布的特点是,与高斯正态分布相比,它仍然给远离均值的点分配相对较高的概率。这种“重尾”特性使得能够充分区分低维空间中远离分析点的点。

这个特性在随机邻域嵌入中被描述为所谓的拥挤问题。它描述了低维空间中的点彼此过于接近的情况,尤其是在它们在高维空间中远离分析点的情况下。这个问题通过 t 分布及其“重尾”得到解决,因为它使得即使对于远离的点也能保持一定程度的分离。

t 分布中的所谓自由度是一个参数,它决定了用于创建估计的独立样本的数量。这些自由度对分布也有相当大的影响,因为它们表示分布扩展的程度。自由度越多,分布越窄,越接近正态分布。

t-SNE 选择一自由度以生成“重尾”,从而在中心之外有更多的度量,即平均值。因此,低自由度意味着异常数据点的概率更大。在 t-SNE 中,这种特性是可取的,以模拟低维空间中的点对点关系。这允许在邻近点和远点之间建立平衡。

因此,从高维空间到低维空间的条件概率必须转换为 t 分布。这可以通过以下公式计算:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c5394a41270a37ecffa5be9e61d158a9.png

这些包括:

  • 𝑦𝑖 和 𝑦𝑗 是低维空间中的两个数据点,它们代表高维空间中的点。

  • 𝑞𝑗|𝑖 是点 𝑦𝑖 和 𝑦𝑗 相近的条件概率,即它们是邻居。

  • ‖‖𝑦𝑖–𝑦𝑗‖‖ 是两点之间的距离。这里应该选择与高维空间中相同的距离度量,即在大多数情况下是欧几里得距离。

  • 分子表示低维空间中两点之间的相似度。为此使用了一自由度的 t 分布。

  • 分母是数据集中两点之间所有概率的总和。这个总和被除以实现归一化,并确保概率之和为 1。

现在的问题是如何将高维空间中现有的条件概率尽可能有效地转移到低维空间中的条件概率。为此,定义了一个优化问题,该问题使用所谓的库尔巴克-莱布勒(KL)散度。使用梯度方法来最小化高维和低维概率之间的散度。

本文并未深入探讨该问题的数学公式,只是描述了示意图程序。优化是一个迭代过程,其中计算两个概率的散度,然后计算单一点的导数。这个值表示一个点的低维映射应该改变多少。符号确定变化的方向和强度。这允许减少两个概率之间的散度,t-SNE 的目标是达到最低可能的散度,因为此时高维和低维空间中的条件概率尽可能相似。

这个迭代过程一直进行,直到达到所谓的收敛标准,例如达到最大重复次数或两个概率之间的散度低于指定的值。

t-SNE 的超参数有哪些?

t-SNE 算法有几个超参数,这些超参数影响模型的行为和性能。本节介绍了关键的超参数,并展示了当这些值调整时模型如何变化。

困惑度衡量在嵌入过程中每个点考虑了多少个邻居。高值意味着包括更多的邻居,因此远距离点的距离在低维中映射得更好。另一方面,低困惑度意味着更关注尽可能准确地映射点的直接邻近区域,即使远距离点的映射可能不够准确。

学习率是梯度方法的核心超参数,它通过逐步迭代改变嵌入位置,使得两个概率分布之间的散度尽可能小。学习率决定了单个嵌入更新的步长。

高学习率会导致嵌入在一次迭代中发生大的变化,一方面可以导致更快地收敛,但另一方面也可能导致学习过程不稳定,因为最优结果可能被跳过,因此模型波动很大。另一方面,低学习率意味着可能需要更多的迭代才能达到最优,但训练将更加均匀。

在开始训练之前,您必须确定何时应该停止训练。为此,可以设置一个发散阈值,一旦首次低于该阈值,训练就会停止,或者可以设置一个最大迭代次数。这个数字决定了嵌入位置可以优化的频率,对于许多应用来说,这个数字可以是几百或几千。

迭代次数应该取决于学习率、数据和可用资源量。如果可能的话,最好使用组合并定义一个所谓的提前停止规则,其中模型要么在达到发散阈值时停止,要么达到最大迭代次数时停止。

T-SNE 旨在以这种方式转换高维数据集,使其能够以显著更少的维度管理。这里的目的是通常将嵌入空间的维度限制在两个或三个,以便数据可以被人类用户可视化和解释。在这种情况下,使用三维嵌入来给模型提供更多描绘数据集原始信息的机会是有意义的。二维排列通常更容易解释,但也提供了更少的信息内容。

当使用 t-SNE 时,另一个超参数是所使用的距离度量。默认情况下,选择欧几里得距离,它将两个点的所有维度的差异平方后相加。这个度量不仅易于计算,而且对于许多应用来说是一个合适的起点。然而,在特殊情况下,选择其他距离度量可能是有用的。例如,这些包括:

  • 余弦距离:所谓的余弦相似度通过确定两个向量之间的角度来衡量两个向量有多相似。余弦距离是通过从 1 中减去余弦相似度来计算的。这个距离越大,两个向量之间的差异就越大。这个度量在自然语言处理中很有用,例如,在单词由向量表示的情况下。向量的相似性,即所用单词的意义,比向量的长度更重要,向量的长度编码了单词的语义意义。

  • 曼哈顿距离:这种距离度量也称为城市街区距离,因为它不计算点之间的直接距离,而是计算所有维度上的绝对差异。这个昵称来源于它就像曼哈顿的出租车司机一样,必须遵循街道,因此从一个街区开到另一个街区。当维度中的特征不是正态分布或者数据集中有异常值时,应该使用这个距离度量。

这些是在训练 t-SNE 时的最重要的超参数。与其他模型一样,没有适用于所有应用和数据集的最佳设置值。相反,必须对超参数进行实验,以找到最佳值集并训练一个高效的模型。

t-SNE 的局限性是什么?

t-SNE 是一种强大的方法,可以在尽可能保留原始数据信息的情况下降低数据集的维度。然而,在使用它之前,应该考虑一些负面因素。

执行 t-SNE 可能非常计算密集和耗时,尤其是在处理大型数据集时。特别是损失函数的优化需要多次迭代,直到获得有意义的成果。

该算法使用多个超参数,这些参数对模型的性能有重大影响,因此必须谨慎设置。选择合适的值通常需要各种测试,这些测试既耗时又消耗计算资源。

t-SNE 中的损失函数具有数学性质,即它不是凸函数。这意味着图中有几个所谓的局部最小值,只有一个唯一的全局最小值。局部最小值的特点是它是某个范围内的最低点,但不是整个定义范围内的绝对最低点。在优化损失函数的过程中,试图达到一个概率分布差异尽可能小的状态。

根据学习率的规模,现在可能会发生算法达到局部最小值并且无法从中移动的情况,因为损失在所有可能的学习率步骤中都在增加。这会让算法误以为它处于一个损失最小的最优状态。然而,这并不是最佳配置,而只是一个局部最小值。

t-SNE 的另一个缺点是,算法没有学习一个通用的嵌入函数,该函数也可以应用于新的数据点。概率分布仅适用于当前数据集,不能推广到新点。因此,如果数据集扩大,必须计算新的概率分布。

此外,t-SNE 是非确定性的,因此使用相同的超参数进行多次训练运行可能会导致不同的结果。这与概率分布的使用有关。多次运行将导致相似但通常不是完全相同的结果。

t-SNE 的另一个重要缺点是全局结构和距离通常丢失,而重点主要在局部结构上。因此,全局关系可能会被误解,这就是为什么 t-SNE 应该仅作为高维数据的可视化辅助工具使用,而不是用于聚类数据,因为它可能导致错误的结果。此外,数据在应用 t-SNE 后似乎形成完美的簇,这通常也是误导性的,尽管在现实中这并不一定是这样,通常是因为全局结构没有最优地映射,而重点在直接邻居上。

t-SNE 与 PCA 对比

t-SNE 和 PCA 是两种关键的降维技术,在多种分析中广泛用于降低维度和可视化高维数据。然而,在选择时,两种方法之间有一些基本差异应该考虑。

PCA是一种基于协方差矩阵的线性降维方法,它使用其特征值和特征向量来找到数据集的低维表示。具有最高特征值的特征向量用于将数据转换到数据空间,并仍然获得数据集的最大方差。

揭秘主成分分析:初学者指南

另一方面,t-SNE 是一种非线性方法,旨在尽可能准确地映射低维空间中数据之间的距离。为此,计算任何两点成为邻居的条件概率。然后在低维空间中产生一个类似的概率。为此,逐步最小化两个分布之间的 Kullback-Leibler 散度。

这些不同的架构也导致了一些差异:

  • 线性:如上所述,PCA 是一种线性方法,这意味着只能记录数据点之间的线性关系。这通常不足以捕捉数据集的复杂性。相比之下,t-SNE 是一种非线性方法,可以捕捉数据之间更复杂的关系。

  • 可解释性:主成分分析通常提供更好的可解释性,因为单个成分是原始特征的线性总结,并且还可以确定哪些特征对主成分有贡献以及贡献的程度。另一方面,t-SNE 中,低维度的含义与原始维度没有直接关系,也不容易解释。因此,通常需要进一步分析来理解低维度的实际含义。

  • 计算时间:特别是对于具有许多维度的大数据集,如何有效地扩展该方法以及它需要多少计算时间非常重要。PCA 通常比 t-SNE 表现更好,因为它是一种线性方法,因此可以使用更有效的方法。另一方面,t-SNE 的计算时间预测要复杂得多,因为它是一个复杂、迭代的优化过程,很难预测结果收敛所需的时间。如果数据集变得更大,计算时间也会相应增加,因为迭代方法,如梯度方法,会变得更加复杂。

  • 超参数:主成分分析不需要任何超参数,因此对于同一数据集总是提供相同的结果。然而,对于 t-SNE,存在各种超参数,例如困惑度或学习率,这些参数对结果有决定性的影响,因此应该仔细调整。这个过程需要花费很多时间,尤其是在高维数据集的情况下,因为必须测试和比较不同的参数组合。

  • 确定性:在计算机科学中,确定性意味着系统对于输入总是提供相同的结果,因为总是以相同的中间结果运行相同的流程。主成分分析是一个确定性过程,因为相同的 dataset 总是会提供相同的特征向量。另一方面,t-SNE,即使具有相同的超参数,也可能在不同的运行中出现不同的结果,因此它是一个随机过程。这是因为优化过程可能会陷入局部最小值,因此并不总是能找到最优结果。因此,只有主成分分析能提供最优结果总会被找到的确定性。

  • 处理新数据:主成分分析还提供了将新数据点转移到低维度的可能性。相应的特征向量一旦在数据集上训练,就可以用于转换,因为存在一个固定的规则来决定如何将高维点转换为低维点。然而,对于 t-SNE,情况则不同,因为它并没有从高维空间直接学习到低维空间的功能,而只是学习到一个概率分布。这不能应用于新数据点,而必须从头开始一个新的优化过程来转换一个新数据点。

  • 维度:T-SNE 旨在尽可能准确地将在高维空间中的距离转移到低维。这通常由于所谓的拥挤问题而失败,该问题描述了高维空间中的数据点在低维空间中非常接近的事实。然而,低维空间具有更多维度,这种拥挤问题就越不严重。因此,t-SNE 仅在维度较少时才适合降维,例如,两个或三个维度。在更高维度中,结果的最优性可能无法保证。另一方面,主成分分析的结果不受所选维度的限制,因为总是试图根据指定的维度数最大化解释方差。因此,结果的质量与维度无关。

  • 应用:这些差异也意味着两种方法的适用领域和使用方式不同。主成分分析通常用于长期将数据集转换为低维,并能够转换新数据。因此,它主要用于特征提取或数据压缩。另一方面,t-SNE 方法用于探索性数据分析,以可视化大型数据集,了解信息并识别可能的模式。然而,它通常不用于实际的数据压缩。

PCA 和 t-SNE 是降维领域中广泛使用且有效的算法。然而,在选择相应方法时,它们在各个方面都有所不同。总之,t-SNE 是一种适合可视化高维数据集和检测可能模式的合适方法。另一方面,PCA 是一种确定性的替代方案,它能够实现快速的降维,并提供一种可重复地将新数据转移到低维空间的方法。

如何在 Python 中实现 t-SNE?

Python 的机器学习库Scikit-Learn除了其他功能外,还有一个函数可以在几个步骤内执行使用 t-SNE 的降维。Auto-MPG 数据集(CC BY 4.0)也以相同的方式用于此,就像主成分分析示例中那样。

本例中所需的导入包括Pandas用于处理数据集,Scikit-Learn 用于缩放数据,以及使用 t-SNE 进行降维,以及 matplotlib,以便之后也可以可视化二维数据。

Deepnote

数据集从 CSV 文件中加载,然后移除分类变量 origin,因为 t-SNE 无法轻松处理它。此外,还移除了每加仑英里数(MPG)的信息,因为这不应该包含在降维中。在许多情况下,t-SNE 是训练机器学习模型的一个预处理步骤。为此,MPG 将作为目标变量,因此不应进行降维。

Deepnote

在应用 t-SNE 算法处理数据之前,将维度缩放到一个统一值(例如 0 到 1 之间)是一个好主意。尽管这不是一个必要的步骤,但它可以对训练过程产生有益的影响,使得具有更高尺度的维度在降维过程中不会仅仅因为尺度较高而被优先考虑。此外,使用缩放后的维度,t-SNE 也可以更快地收敛。

数据集的扩展方法有很多。在这个例子中,使用了标准缩放器。

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fembed.deepnote.com%2Fa7070c44-61b9-4249-b55a-9e3862d2609e%2F361fbd2c317246ba82e116e0f235ccf1%2F5e34db3e3e214a2c99652af9df35dd40%3Fheight%3D119&display_name=Deepnote&url=https%3A%2F%2Fembed.deepnote.com%2Fa7070c44-61b9-4249-b55a-9e3862d2609e%2F361fbd2c317246ba82e116e0f235ccf1%2F5e34db3e3e214a2c99652af9df35dd40%3Fheight%3D119&image=https%3A%2F%2Fdeepnote.com%2Fstatic%2Fthumbnails%2Fmain.png&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=deepnote

然后使用超参数实例化 t-SNE 变量。这决定了结果应该有多少个组件,即结果应该有多少个维度。学习率指定了迭代之间的步长大小,而困惑度决定了近邻点对概率的影响与远点相比的大小。

cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fembed.deepnote.com%2Fa7070c44-61b9-4249-b55a-9e3862d2609e%2F361fbd2c317246ba82e116e0f235ccf1%2F50b71465fdb841f2af11aadb90374719%3Fheight%3D119&display_name=Deepnote&url=https%3A%2F%2Fembed.deepnote.com%2Fa7070c44-61b9-4249-b55a-9e3862d2609e%2F361fbd2c317246ba82e116e0f235ccf1%2F50b71465fdb841f2af11aadb90374719%3Fheight%3D119&image=https%3A%2F%2Fdeepnote.com%2Fstatic%2Fthumbnails%2Fmain.png&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=deepnote

现在可以将 t-SNE 训练过程的结果可视化在二维图中。需要注意的是,这两个维度与原始维度不再有任何关系,因此不能直接命名,因为它们代表了之前使用的维度的混合。

Deepnote

这是你应该带走的内容

  • t-distributed stochastic neighbor embedding(简称 tSNE)是一种用于大型数据集降维的无监督算法。

  • 它用于降低数据集的维度,从而防止模型可能出现的过度拟合。

  • 与主成分分析的主要区别在于,它也可以用于数据点之间的非线性关系。这一特性具有深远的影响,例如,对结果的可重复性或所需的计算时间有影响。

  • 在 Python 中,可以使用 Scikit-Learn 库实现 t-SNE,例如。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 1:35:55

零基础教程:用ollama快速玩转LFM2.5-1.2B文本生成模型

零基础教程:用ollama快速玩转LFM2.5-1.2B文本生成模型 1. 为什么你值得花10分钟试试这个模型 你有没有过这样的体验:想用一个轻量级AI写点东西,但发现要么要配GPU、要么要折腾Python环境、要么生成效果干巴巴像机器人?LFM2.5-1.…

作者头像 李华
网站建设 2026/4/3 4:31:39

真实案例分享:我用Unsloth训练了专属客服机器人

真实案例分享:我用Unsloth训练了专属客服机器人 你有没有试过——花三天微调一个7B模型,结果显存爆掉、训练中断、日志报错堆成山? 我也有。直到上个月,我把客服对话数据喂给Unsloth,2小时完成QLoRA微调,显…

作者头像 李华
网站建设 2026/4/1 3:28:55

Firewalld 防火墙实战:跨主机与本地端口转发配置详解

1. 初识Firewalld端口转发:网络流量的交通指挥 端口转发就像是网络世界里的交通警察,指挥着数据包该往哪个方向流动。想象一下你住在一个小区里,快递员要把包裹送到你家,但小区大门有严格的安检(防火墙)。端…

作者头像 李华
网站建设 2026/4/2 6:47:24

告别右键灾难:3分钟打造极速响应的个性化菜单

告别右键灾难:3分钟打造极速响应的个性化菜单 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 右键菜单管理是每个Windows用户提升效率的必经之路&…

作者头像 李华