大数据挖掘--两个角度理解相似度计算理论

文章目录

  • 0 相似度计算可以转换成什么问题
  • 1 集合相似度的应用
    • 1.1 集合相似度
      • 1.1文档相似度
      • 1.2 协同过滤
        • 用户-用户协同过滤
        • 物品-物品协同过滤
    • 1.2 文档的shingling--将文档表示成集合
      • 1.2.1 k-shingling
      • 1.2.2 基于停用词的 shingling
    • 1.3 最小哈希签名
    • 1.4 局部敏感哈希算法(LSH)
    • 1.5 最小哈希签名和局部敏感哈希(LSH)的概念结合示例
        • 最小哈希签名步骤:
        • 局部敏感哈希 (LSH) 步骤:
  • 2 距离测度的应用
    • 2.1 距离测度
      • 1. 欧氏距离 (Euclidean Distance)
      • 2. 余弦距离 (Cosine Distance)
      • 3. 编辑距离 (Edit Distance)
      • 4. 海明距离 (Hamming Distance)
  • 3 LSH函数家族

0 相似度计算可以转换成什么问题

相似度计算是数据分析和机器学习领域中一项关键任务,它可以帮助我们理解和分析不同对象之间的相似性。然而,相似度计算本身可以通过转换成其他类型的问题来更加有效地处理和解决。

首先,我们来看一种常见的相似度度量——Jaccard相似度。Jaccard相似度将相似度计算视为集合之间的比较问题。具体来说,它关注两个集合之间的交集相对于并集的大小。这种方法特别适合用于需要比较集合相似性的场景,比如在文本分析中,我们可以将文档表示为一组词的集合,Jaccard相似度帮助我们评估两份文档的相似程度。通过计算交集和并集,我们将相似度问题转化为集合运算问题,这种方法简洁而有效,尤其在需要处理大量数据时,利用集合操作的高效性可以显著提高计算速度。

另一方面,相似度计算也可以转换为距离测度的问题。在这种情况下,我们将对象视为几何空间中的点,计算这些点之间的距离来推断相似性。欧氏距离是一种直观的衡量方式,它通过计算两点之间的直线距离来评估它们的接近程度。这种方法在需要空间可视化的场合中非常有用。此外,还有曼哈顿距离,它通过计算路径总长来反映两点的差异,这在某些离散空间中表现出色。余弦相似度则提供了另一种转换视角,通过考察向量之间的夹角来确定它们的相似性,这在高维向量空间中,尤其在文本分析和推荐系统中,被广泛使用。

1 集合相似度的应用

1.1 集合相似度

1.1文档相似度

在文本分析中,我们常常需要衡量两篇文档之间的相似性,这可以通过集合相似度来实现。一个常用的方法是Jaccard相似度。假设有两个文档 A A A B B B,我们可以将它们表示为词的集合,分别记为 S A S_A SA S B S_B SB。Jaccard相似度计算公式如下:

J ( S A , S B ) = ∣ S A ∩ S B ∣ ∣ S A ∪ S B ∣ J(S_A, S_B) = \frac{|S_A \cap S_B|}{|S_A \cup S_B|} J(SA,SB)=SASBSASB

其中, ∣ S A ∩ S B ∣ |S_A \cap S_B| SASB 是两个集合的交集的大小, ∣ S A ∪ S B ∣ |S_A \cup S_B| SASB 是两个集合的并集的大小。Jaccard相似度的值在 0 到 1 之间,值越大表示两个文档越相似。

算法:在实际应用中,计算文档相似度时,我们可以进行如下步骤:

  1. 将每个文档转换为词集合。
  2. 计算每对文档集合的交集和并集大小。
  3. 应用Jaccard公式计算相似度。

这种方法简单高效,特别适合于初步的文本聚类和分类问题。

1.2 协同过滤

在推荐系统中,协同过滤是一种广泛使用的方法。这里我们主要探讨基于集合相似度的协同过滤,包括用户-用户和物品-物品协同过滤。

用户-用户协同过滤

在用户-用户协同过滤中,我们通过比较用户之间的兴趣相似性来进行推荐。假设我们有用户 u i u_i ui u j u_j uj,它们的兴趣集合分别为 I i I_i Ii I j I_j Ij。我们可以使用Jaccard相似度来计算用户相似性:

J ( I i , I j ) = ∣ I i ∩ I j ∣ ∣ I i ∪ I j ∣ J(I_i, I_j) = \frac{|I_i \cap I_j|}{|I_i \cup I_j|} J(Ii,Ij)=IiIjIiIj

通过计算用户之间的Jaccard相似度,我们可以为用户推荐那些相似用户喜欢的物品。

物品-物品协同过滤

类似地,在物品-物品协同过滤中,我们比较物品之间的相似性。假设有物品 p a p_a pa p b p_b pb,它们的用户集合分别为 U a U_a Ua U b U_b Ub,我们计算物品的Jaccard相似度:

J ( U a , U b ) = ∣ U a ∩ U b ∣ ∣ U a ∪ U b ∣ J(U_a, U_b) = \frac{|U_a \cap U_b|}{|U_a \cup U_b|} J(Ua,Ub)=UaUbUaUb

物品相似性可以帮助我们推荐用户可能喜欢的其他相似物品。

算法:协同过滤的基本步骤包括:

  1. 构建用户-物品矩阵。
  2. 根据需要选择用户-用户或物品-物品的相似度计算。
  3. 计算相似度矩阵。
  4. 根据相似度为用户生成推荐列表。

通过利用集合相似度,我们能够有效地实现协同过滤,使推荐系统更加智能化和个性化。这些方法不仅提高了推荐的准确性,还提升了用户的参与感和满意度。

1.2 文档的shingling–将文档表示成集合

在文本处理和分析过程中,将文档转换为集合的形式可以帮助我们更好地进行相似度分析和其他文本操作。其中,shingling 是一种将文档转化为集合的方法,通过将文档分割为一系列短的连续子序列(或称为“片段”)来实现。以下是关于 k-shingling 和基于停用词的 shingling 的详细介绍。

1.2.1 k-shingling

k-shingling 是一种将文档转化为子序列集合的方法,通过将文档中的文本分割为长度为 k 的连续子字符串(或子词)来实现。每一个长度为 k 的子串称为一个“shingle”。这种方法的核心在于选择合适的 k 值,以确保文档可以被合理地分割。

步骤:

  1. 选择 k 值:通常,k 的选择取决于具体应用和文档长度。较小的 k 值可以捕捉到更多的局部信息,而较大的 k 值更能反映文档的全局结构。

  2. 生成 shingles:从文档中提取所有可能的 k-shingles。对于每一个连续的 k 个字符或词,记录为一个 shingle。

  3. 构建集合:将所有提取的 shingles 组成一个集合。此集合可以用来比较不同文档的相似性。

示例:对于字符串 “The quick brown fox” 和 k = 2,可能的 shingles 为 {“Th”, “he”, "e “, " q”, “qu”, “ui”, “ic”, “ck”, "k “, " b”, “br”, “ro”, “ow”, “wn”, "n “, " f”, “fo”, “ox”}。

1.2.2 基于停用词的 shingling

基于停用词的 shingling 是一种改进的 shingling 方法,它通过忽略文档中的停用词(例如 “the”, “is”, “at”, “on” 等),来生成更具意义的 shingles。这种方法可以帮助减少噪声,提高文档相似度计算的精确度。

步骤:

  1. 移除停用词:在进行 shingling 之前,首先从文档中移除常见的停用词。这可以通过预定义的停用词列表实现。

  2. 生成 shingles:在移除停用词后,使用类似 k-shingling 的方法生成 shingles。这样生成的 shingles 更能体现文档的核心内容。

  3. 构建集合:将生成的 shingles 组成一个集合,用于进一步的相似度计算。

优点:通过忽略停用词,基于停用词的 shingling 能够更专注于文档的主题词汇,减少不必要的干扰。

好的,以下是关于如何使用最小哈希签名将大文档压缩成小的签名,以及如何利用局部敏感哈希(LSH)算法处理这些签名,以保持文档间的相似度。

1.3 最小哈希签名

最小哈希签名是一种将大集合(如文档中的术语集合)压缩成较小的签名的技术,同时保留集合之间的相似度。这是通过一组哈希函数实现的,它们将集合中的元素映射到整数,并选取最小的数值作为签名。

步骤:

  1. 选择哈希函数:选择一组不同的哈希函数 h 1 , h 2 , … , h n h_1, h_2, \ldots, h_n h1,h2,,hn。每个哈希函数将文档中的shingle(子字符串)映射到一个整数。

  2. 生成签名:对于每个文档和每个哈希函数,计算所有shingle的哈希值,并记录最小的哈希值。重复此过程n次(使用n个不同的哈希函数),形成一个长度为n的签名向量。

  3. 保持相似度:两个文档的最小哈希签名相同元素的比例,接近于这两个文档的Jaccard相似度,即 J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ J(A, B) = \frac{|A \cap B|}{|A \cup B|} J(A,B)=ABAB

1.4 局部敏感哈希算法(LSH)

LSH 是一种用于快速查找相似文档的算法,特别适用于处理最小哈希签名。这种方法通过将签名分段,并使用哈希函数将相似的签名段映射到相同的桶中,从而实现高效的近似最近邻搜索。

步骤:

  1. 分段签名:将最小哈希签名分成若干段,每段包含若干个哈希值。例如,每个签名被分成b个段,每段包含r个哈希值。

  2. 映射到桶:对每个段,使用一个哈希函数将其映射到一个哈希桶。相似的文档由于签名段的相似性,很可能被映射到同一个桶中。

  3. 查找相似文档:当需要查找与某个文档相似的文档时,可以仅查找与其签名段映射到相同桶中的文档,这大大缩小了查找范围。

优势:通过结合最小哈希签名和 LSH,能够有效地处理和比较大规模文档集合。最小哈希签名减少了需要处理的数据量,而 LSH 提供了快速的相似性检索机制,使得处理大规模数据集的效率得以提升。

1.5 最小哈希签名和局部敏感哈希(LSH)的概念结合示例

假设我们有两个文档,它们的 shingle 集合如下:

  • 文档 A: {“shingle1”, “shingle2”, “shingle3”}
  • 文档 B: {“shingle2”, “shingle3”, “shingle4”}

我们应用三组不同的哈希函数 h 1 ( x ) h_1(x) h1(x), h 2 ( x ) h_2(x) h2(x), h 3 ( x ) h_3(x) h3(x),假设这些函数的输出如下:

  • h 1 ( " s h i n g l e 1 " ) = 5 h_1("shingle1") = 5 h1("shingle1")=5, h 1 ( " s h i n g l e 2 " ) = 3 h_1("shingle2") = 3 h1("shingle2")=3, h 1 ( " s h i n g l e 3 " ) = 7 h_1("shingle3") = 7 h1("shingle3")=7, h 1 ( " s h i n g l e 4 " ) = 6 h_1("shingle4") = 6 h1("shingle4")=6
  • h 2 ( " s h i n g l e 1 " ) = 2 h_2("shingle1") = 2 h2("shingle1")=2, h 2 ( " s h i n g l e 2 " ) = 9 h_2("shingle2") = 9 h2("shingle2")=9, h 2 ( " s h i n g l e 3 " ) = 1 h_2("shingle3") = 1 h2("shingle3")=1, h 2 ( " s h i n g l e 4 " ) = 4 h_2("shingle4") = 4 h2("shingle4")=4
  • h 3 ( " s h i n g l e 1 " ) = 8 h_3("shingle1") = 8 h3("shingle1")=8, h 3 ( " s h i n g l e 2 " ) = 6 h_3("shingle2") = 6 h3("shingle2")=6, h 3 ( " s h i n g l e 3 " ) = 5 h_3("shingle3") = 5 h3("shingle3")=5, h 3 ( " s h i n g l e 4 " ) = 3 h_3("shingle4") = 3 h3("shingle4")=3
最小哈希签名步骤:
  1. 计算最小哈希签名

    • 对于文档 A:
      • h 1 h_1 h1: 最小值是 3 (来自 “shingle2”)
      • h 2 h_2 h2: 最小值是 1 (来自 “shingle3”)
      • h 3 h_3 h3: 最小值是 5 (来自 “shingle3”)
    • 对于文档 B:
      • h 1 h_1 h1: 最小值是 3 (来自 “shingle2”)
      • h 2 h_2 h2: 最小值是 1 (来自 “shingle3”)
      • h 3 h_3 h3: 最小值是 3 (来自 “shingle4”)
  2. 生成最小哈希签名

    • 文档 A 的签名: (3, 1, 5)
    • 文档 B 的签名: (3, 1, 3)
  3. 比较签名:通过比较签名发现,文档 A 和 B 在三个哈希函数中有两个值相同,签名相同位置的值相同比例为 2/3。

局部敏感哈希 (LSH) 步骤:
  1. 分段签名

    • 将签名分成两段,每段包含一组哈希值:
      • 文档 A: (3, 1) 和 (5)
      • 文档 B: (3, 1) 和 (3)
  2. 映射到桶

    • 使用哈希函数对每一段进行哈希,映射到哈希桶:
      • 段 (3, 1) 的两文档都被映射到同一个桶,因此它们可能相似。
      • 段 (5) 和 (3) 被映射到不同的桶。
  3. 查找相似文档

    • 由于文档 A 和 B 在 (3, 1) 段中被映射到同一个桶,因此 LSH 会识别文档 B 作为文档 A 的相似候选者。

通过结合最小哈希签名和 LSH,我们大幅度降低了计算复杂度。最小哈希签名帮助我们压缩文档,同时保留相似度信息,而 LSH 则通过分段签名和桶映射,快速聚合可能相似的文档以进行进一步的精细比较。这种方法尤其适用于需要快速处理和比较的大规模数据集。

2 距离测度的应用

2.1 距离测度

1. 欧氏距离 (Euclidean Distance)

  • 定义:欧氏距离是两点间的“直线”距离,用于度量两个点在欧几里得空间中的距离。对于两个n维向量 A = ( a 1 , a 2 , . . . , a n ) A = (a_1, a_2, ..., a_n) A=(a1,a2,...,an) B = ( b 1 , b 2 , . . . , b n ) B = (b_1, b_2, ..., b_n) B=(b1,b2,...,bn),其计算公式为:
    Euclidean Distance = ∑ i = 1 n ( a i − b i ) 2 \text{Euclidean Distance} = \sqrt{\sum_{i=1}^{n} (a_i - b_i)^2} Euclidean Distance=i=1n(aibi)2
  • 应用:常用于几何空间中的距离计算,如图像处理、聚类分析(如k-means算法)。

2. 余弦距离 (Cosine Distance)

  • 定义:余弦距离实际上测量的是两个向量之间的夹角余弦值,表示两个向量的方向相似度。计算公式为:
    Cosine Similarity = A ⋅ B ∥ A ∥ ∥ B ∥ \text{Cosine Similarity} = \frac{A \cdot B}{\|A\| \|B\|} Cosine Similarity=A∥∥BAB
    余弦距离则为 1 − Cosine Similarity 1 - \text{Cosine Similarity} 1Cosine Similarity
  • 应用:适用于文本分析和信息检索,因为它关注的是向量的方向而不是大小,比如在文档相似性计算中。

3. 编辑距离 (Edit Distance)

  • 定义:编辑距离,又称Levenshtein距离,是将一个字符串转换成另一个字符串所需的最小编辑操作次数(包括插入、删除、替换的操作)。
  • 应用:广泛用于拼写检查、DNA序列比对和自然语言处理中。

4. 海明距离 (Hamming Distance)

  • 定义:海明距离用于衡量两个等长字符串之间的差异,即在相同位置上不同字符的数量。
  • 应用:主要用于编码理论和信息技术中的错误检测和纠正,例如校验和比较二进制字符串。

3 LSH函数家族

算法定义中心思想核心公式优点缺点应用场景
MinHash LSH用于集合相似性的LSH方法通过最小哈希签名计算集合的Jaccard相似度 h ( A ) = min ⁡ ( { h i ( x ) ∣ x ∈ A } ) h(A) = \min(\{h_i(x) \mid x \in A\}) h(A)=min({hi(x)xA})高效处理集合相似性,减少计算量需要预计算最小哈希签名文档去重,集合相似性计算
SimHash用于文本和文档相似性的LSH方法将高维向量降维为短签名,保留方向信息 s = sign ( ∑ w i x i ) s = \text{sign}(\sum w_i x_i) s=sign(wixi)适合处理高维数据,方向不变性不适合处理完全不同的文本文本检索,文档相似性计算
p-stable LSH用于欧氏距离的LSH方法基于p-stable分布投影到低维空间 h ( x ) = ⌊ a ⋅ x + b r ⌋ h(x) = \lfloor \frac{a \cdot x + b}{r} \rfloor h(x)=rax+b准确近似欧氏距离,适合高维数值数据投影精度依赖于维度选择图像检索,数值数据相似性计算
Bit Sampling LSH用于汉明距离的LSH方法从二进制字符串中随机选择位作为特征直接位选择简单高效,直接操作二进制数据仅适合固定长度的二进制数据二进制数据比较,错误检测和校验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/67843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于贪心学习的文笔记录

贪心,顾名思义就是越贪越好,越多越有易,他给我的感觉是,通常是求最大或最小问题,相比于动态规划贪心让人更加琢磨不透,不易看出方法,为此在这记录我所见过的题型和思维方法,以便回头…

c语言练习题【数据类型、递归、双向链表快速排序】

练习1:数据类型 请写出以下几个数据的数据类型 整数 a a 的地址 存放a的数组 b 存放a的地址的数组 b的地址 c的地址 指向 printf 函数的指针 d 存放 d的数组 整数 a 的类型 数据类型是 int a 的地址 数据类型是 int*(指向 int 类型的指针) …

联想拯救者Y9000P IRX8 2023 (82WK) 原厂Win11 家庭中文版系统 带一键还原功能 安装教程

安装完重建winre一键还原功能,和电脑出厂时的系统状态一模一样。自动机型专用软件,全部驱动,主题壁纸,自动激活,oem信息等。将电脑系统完全恢复到出厂时状态。 支持机型 (MTM) : 82WK 系统版本:Windows 1…

搜索与图论复习2最短路

单源最短路---所有边权是正数(Dijkstra算法O(n^2)--稠密图(邻接矩阵)和堆优化的Dijkstra算法O(mlogn)--稀疏图(邻接表)) 或存在负边权(Bellman-ford贝尔曼福特算法O(nm)和SPFA一般O(m) 最坏O(nm) ) 多源最短路---Floyd算法O(n^3) 一、迪杰斯特拉算法(Dijkstra):1…

Unity GetLocalizedString()失效问题

问题: 在一个自定义类中调用GetLocalizedString()的方法,是无效的(创建这个自定义类的脚本没挂载到场景中)。 解决方法: 将自定义类的GetLocalizedString()方法换个地方,换到在场景中挂载的一个脚本实例(…

【建站】专栏目录

建站专栏的想法有很多,想写穷鬼如何快速低成本部署前后端项目让用户能访问到,如何将网站收录到百度,bing,google并优化seo让搜索引擎搜索到网站,想写如何把网站加入google广告或者接入stripe信用卡首款平台收款&#x…

深入解析“legit”的地道用法——从俚语到正式表达:Sam Altman用来形容DeepSeek: legit invigorating(真的令人振奋)

深入解析“legit”的地道用法——从俚语到正式表达 一、引言 在社交媒体、科技圈甚至日常对话中,我们经常会看到或听到“legit”这个词。比如最近 Sam Altman 在 X(原 Twitter)上发的一条帖子中写道: we will obviously deliver …

Vue 图片引用方式详解:静态资源与动态路径访问

目录 前言1. 引用 public/ 目录2. assets/ 目录3. 远程服务器4. Vue Router 动态访问5. 总结6. 扩展(图片不显示) 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 在 Vue 开发中&#x…

DeepSeek-R1 本地部署教程(超简版)

文章目录 一、DeepSeek相关网站二、DeepSeek-R1硬件要求三、本地部署DeepSeek-R11. 安装Ollama1.1 Windows1.2 Linux1.3 macOS 2. 下载和运行DeepSeek模型3. 列出本地已下载的模型 四、Ollama命令大全五、常见问题解决附:DeepSeek模型资源 一、DeepSeek相关网站 官…

JVM运行时数据区域-附面试题

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是 依赖用户线程的启动和结束而建立和销毁。 1. 程序计…

什么是LPU?会打破全球算力市场格局吗?

在生成式AI向垂直领域纵深发展的关键节点,一场静默的芯片革命正在改写算力规则。Groq研发的LPU(Language Processing Unit)凭借其颠覆性架构,不仅突破了传统GPU的性能天花板,更通过与DeepSeek等国产大模型的深度协同&a…

如何构建ObjC语言编译环境?构建无比简洁的clang编译ObjC环境?Windows搭建Swift语言编译环境?

如何构建ObjC语言编译环境? 除了在线ObjC编译器,本地环境Windows/Mac/Linux均可以搭建ObjC编译环境。 Mac自然不用多说,ObjC是亲儿子。(WSL Ubuntu 22.04) Ubuntu可以安装gobjc/gnustep和gnustep-devel构建编译环境。 sudo apt-get install gobjc gnus…

2月3日星期一今日早报简报微语报早读

2月3日星期一,农历正月初六,早报#微语早读。 1、多个景区发布公告:售票数量已达上限,请游客合理安排行程; 2、2025春节档总票房破70亿,《哪吒之魔童闹海》破31亿; 3、美宣布对中国商品加征10…

DeepSeek 原理解析:与主流大模型的差异及低算力优势

在人工智能大模型蓬勃发展的浪潮中,DeepSeek 以其独特的技术路线和出色的性能表现脱颖而出。与主流大模型相比,DeepSeek 不仅在技术原理上有着显著的差异,还展现出了在较低算力下达到 OpenAI API 水平的卓越能力。本文将深入剖析这些独特之处…

C++ Primer 标准库vector

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.6 广播机制核心算法:维度扩展的数学建模

2.6 广播机制核心算法:维度扩展的数学建模 目录/提纲 #mermaid-svg-IfELXmhcsdH1tW69 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IfELXmhcsdH1tW69 .error-icon{fill:#552222;}#mermaid-svg-IfELXm…

【Elasticsearch】硬件资源优化

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

bootstrap.yml文件未自动加载问题解决方案

在添加bootstrap.yml文件后,程序未自动扫描到,即图标是这样的: 查了一些资料,是缺少bootstrap相关依赖,虽然已经添加了spring-cloud-context依赖,但是这个依赖并未引入bootstrap依赖,可能是版本问题,需要手动引入 <dependency><groupId>org.springframework.cloud&…

C++底层学习预备:模板初阶

文章目录 1.编程范式2.函数模板2.1 函数模板概念2.2 函数模板原理2.3 函数模板实例化2.3.1 隐式实例化2.3.2 显式实例化 2.4 模板参数的匹配原则 3.类模板希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 进入STL库学习之前我们要先了解有关模板的…

【玩转 Postman 接口测试与开发2_015】第12章:模拟服务器(Mock servers)在 Postman 中的创建与用法(含完整实测效果图)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十二章 模拟服务器&#xff08;Mock servers&#xff09;在 Postman 中的创建与用法1 模拟服务器的概念2 模拟服务器的创建2.1 开启侧边栏2.2 模拟服务器的两种创建方式2.3 私有模拟器的 API 秘钥的用法…