【算法调研】AI领域相似性度量

文本领域:

文本领域的求相似度的方法有很多,我这里只介绍三种方法,并给出部分我跑通了的代码实验。

余弦相似度(Cosine Similarity)

余弦相似度是一种常用于度量两个向量之间相似性的方法,它通常用于文本挖掘和自然语言处理等领域。在文本领域中,可以使用词袋模型或TF-IDF(Term Frequency-Inverse Document Frequency)来表示文本向量,然后通过余弦相似度来计算文本之间的相似程度。

以下是对余弦相似度的详细讲解:

  1. 词袋模型(Bag of Words Model):

    词袋模型是一种简单而常用的文本表示方法,它将文本表示为一个由单词构成的集合,忽略了单词在文本中的顺序和语法结构,只关注单词的出现频率。

  2. TF-IDF表示法:

    TF-IDF是一种用于信息检索和文本挖掘的常用方法,它结合了词频(TF)和逆文档频率(IDF)两个因素来表示单词的重要性。TF表示单词在当前文本中出现的频率,IDF表示单词在整个文本集合中的稀有程度。

  3. 计算余弦相似度:
    余弦相似度是通过计算两个向量之间的夹角来度量它们之间的相似性的方法。在文本领域中,如果将每个文本表示为一个向量,其中每个维度对应一个单词或特征,那么两个文本之间的余弦相似度可以通过以下公式计算:

cosine_similarity ( A , B ) = A ⋅ B ∥ A ∥ ∥ B ∥ \text{cosine\_similarity}(\mathbf{A}, \mathbf{B}) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} cosine_similarity(A,B)=A∥∥BAB

  1. 解释:
    • 如果两个文本之间的夹角接近于0度,则余弦相似度接近于1,表示它们非常相似。
    • 如果两个文本之间的夹角接近于90度,则余弦相似度接近于0,表示它们非常不相似。
    • 如果两个文本之间的夹角为180度,则余弦相似度为-1,表示它们是完全相反的。

因此,通过计算文本之间的余弦相似度,可以快速有效地比较它们之间的相似性,进而用于文本分类、聚类、信息检索等任务中。

实验代码,采用TF-IDF来表示词向量。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 示例文本
documents = [
    "This is the first document.",
    "This document is the second document.",
    "And this is the third one.",
    "Is this the first document?",
]

# 使用TF-IDF向量化文本
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(documents)

# 计算文本之间的余弦相似度
cosine_similarities = cosine_similarity(tfidf_matrix, tfidf_matrix)

# 打印相似度矩阵
print("Cosine Similarity Matrix:")
print(cosine_similarities)

输出结果

Cosine Similarity Matrix:
[[1.         0.64692568 0.30777187 1.        ]
 [0.64692568 1.         0.22523955 0.64692568]
 [0.30777187 0.22523955 1.         0.30777187]
 [1.         0.64692568 0.30777187 1.        ]]

注意到第一句话和第四句话非常相近,其余弦相似度为1

Jaccard相似度(Jaccard Similarity)

基于两个集合的交集与并集之间的比例来度量文本之间的相似性。常用于文本的集合表示,如n-gram模型。

Jaccard相似度实验代码:

def jaccard_similarity(set1, set2):
    intersection = len(set1.intersection(set2))
    union = len(set1.union(set2))
    return intersection / union if union != 0 else 0

# 示例文本
text1 = "apple banana mango"
text2 = "banana orange pineapple"

# 将文本转换为n-gram集合
n = 2
set1 = set([text1[i:i+n] for i in range(len(text1)-n+1)])
set2 = set([text2[i:i+n] for i in range(len(text2)-n+1)])

# 计算Jaccard相似度
similarity = jaccard_similarity(set1, set2)

print("Jaccard Similarity:", similarity)

在这段代码中,我们定义了一个jaccard_similarity函数来计算Jaccard相似度。然后,给出了两个示例文本text1text2。接着,我们使用n-gram模型将文本转换为n-gram集合,并计算它们之间的Jaccard相似度。最后,打印出了计算得到的相似度值。

输出结果

Jaccard Similarity: 0.43478260869565216
  1. 基于深度学习的方法
    • 使用预训练的词嵌入模型(如Word2Vec、GloVe、BERT等)来表示文本,并通过神经网络模型来学习文本之间的相似性。

图像领域:

图像领域的求相似度的方法也有很多,我这里只介绍三种方法,并给出部分我跑通了的代码实验。

  1. 结构相似性指数(Structural Similarity Index,SSIM)

    结构相似性指数(SSIM)是一种广泛用于图像质量评价和图像相似性比较的指标。它不仅考虑了图像的亮度和对比度,还考虑了图像的结构信息,因此在评估图像相似性时更加全面和准确。

SSIM 的计算基于以下三个方面的比较:

  1. 亮度(Luminance):图像的亮度是指图像的平均亮度水平。SSIM 对比两个图像的亮度信息,以确保它们在视觉上保持一致。

  2. 对比度(Contrast):图像的对比度反映了图像中灰度级别的差异程度。SSIM 通过比较两个图像的对比度来捕捉它们的差异。

  3. 结构(Structure):图像的结构信息反映了图像中像素之间的空间关系。SSIM 使用局部窗口来比较图像的结构信息,以确保它们在视觉上的相似性。

SSIM 的计算公式通常表示为:

SSIM ( x , y ) = ( 2 μ x μ y + c 1 ) ( 2 σ x y + c 2 ) ( μ x 2 + μ y 2 + c 1 ) ( σ x 2 + σ y 2 + c 2 ) \text{SSIM}(x, y) = \frac{{(2\mu_x\mu_y + c_1)(2\sigma_{xy} + c_2)}}{{(\mu_x^2 + \mu_y^2 + c_1)(\sigma_x^2 + \sigma_y^2 + c_2)}} SSIM(x,y)=(μx2+μy2+c1)(σx2+σy2+c2)(2μxμy+c1)(2σxy+c2)

其中:

  • (x) 和 (y) 是要比较的两个图像。
  • μ x \mu_x μx μ y \mu_y μy x x x y y y 的平均值。
  • σ x \sigma_x σx σ y \sigma_y σy x x x y y y 的标准差。
  • σ x y \sigma_{xy} σxy x x x y y y 之间的协方差。
  • c 1 c_1 c1 c 2 c_2 c2 是用于稳定计算的常数。

SSIM 的取值范围是 [ − 1 , 1 ] [-1, 1] [1,1],其中 1 表示两个图像完全相同,0 表示两个图像没有任何相似性,-1 表示两个图像完全相反。

总的来说,SSIM 能够比较图像的亮度、对比度和结构信息,并给出一个综合的相似性评分,因此在图像质量评价和图像相似性比较中被广泛应用。

  1. 卷积神经网络(Convolutional Neural Network,CNN)

使用预训练的CNN模型(如VGG、ResNet、Inception等)来提取图像特征,并通过欧氏距离或余弦相似度来度量图像之间的相似性。

在这里插入图片描述在这里插入图片描述

这里利用reset18预训练权重,将两张对比照片提取特征生成两个一维特征向量,计算其向量的余弦相似度。

import torch
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as transforms
import torch.nn.functional as F
from PIL import Image

# 加载预训练的模型
model = models.resnet18(pretrained=True)
# 删除最后一层(分类层)
model = nn.Sequential(*list(model.children())[:-1])
# 设置模型为评估模式
model.eval()

# 图像预处理
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

# 加载并预处理图像
def load_and_preprocess_image(image_path):
    image = Image.open(image_path)
    image = transform(image)
    return image.unsqueeze(0)

# 提取特征
def extract_features(image):
    with torch.no_grad():
        features = model(image)
    return features.view(features.size(0), -1)

# 计算余弦相似度
def cosine_similarity(feature1, feature2):
    return F.cosine_similarity(feature1, feature2).item()

# 两个图像文件路径
image1_path = 'image1.jpg'
image2_path = 'image2.jpg'

# 加载并预处理图像
image1 = load_and_preprocess_image(image1_path)
image2 = load_and_preprocess_image(image2_path)

# 提取特征
feature1 = extract_features(image1)
feature2 = extract_features(image2)

# 计算余弦相似度
similarity = cosine_similarity(feature1, feature2)
print("Cosine similarity between the two images:", similarity)

运行结果

Cosine similarity between the two images: 0.8413233757019043
  1. 感知哈希算法(Perceptual Hashing)

将图像转换为固定长度的哈希码,通过比较哈希码之间的汉明距离来度量图像之间的相似性。

通常情况下,汉明码相似度的计算公式如下所示:

相似度 = 1 − 汉明距离 哈希码长度 \text{相似度} = 1 - \frac{\text{汉明距离}}{\text{哈希码长度}} 相似度=1哈希码长度汉明距离

根据这个公式,相似度的取值范围应该在0到1之间,其中1表示完全相似,0表示完全不同。

from PIL import Image
import imagehash

# 加载并打开两张图像
image1 = Image.open('1.jpg')
image2 = Image.open('2.jpg')

# 预处理调成相同大小的图片
image2 = image2.resize(image1.size)

# 计算哈希码
hash1 = imagehash.phash(image1)
hash2 = imagehash.phash(image2)

# 计算哈希码长度
hash_length = len(hash1.hash)

# 计算汉明距离
hamming_distance = hash1 - hash2

# 计算相似度
similarity = 1 - hamming_distance / (hash_length * 64)  # 64 是哈希码中的比特位数

# 打印相似度
print("Similarity between the two images:", similarity)

输出结果

Similarity between the two images: 0.97265625

汉明距离说明这两张图片非常相似,这两张图片视觉上确实比较相似,但是这两张蒙娜丽莎的图片在内容上却大相径庭。说明仅仅通过哈希码不能很好的区别这两张图片的相似程度。

这些方法都有各自的优缺点,选择合适的方法取决于具体的应用场景和需求。

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
七个人工智能常见术语全文共4页,当前为第1页。七个人工智能常见术语全文共4页,当前为第1页。七个人工智能常见术语 七个人工智能常见术语全文共4页,当前为第1页。 七个人工智能常见术语全文共4页,当前为第1页。 A Algorithms 算法:给AI、神经网络或其他机器提供的一套规则或指令,以帮助它自己学习; 分类,聚类,推荐和回归是四种最流行的类型。 Artificial intelligence 人工智能:机器能够做出决策并执行模拟人类智能和行为的任务。 Artificial neural network 人工神经网络(ANN):一种学习模型,可以像人脑一样工作,解决传统计算机系统难以解决的任务。 Autonomic computing 自主计算:系统的自适应自我管理能力,用于高级计算功能,无需用户输入。 C Chatbots 聊天机器人:聊天机器人(简称聊天机器人),旨在通过文本聊天,语音命令或两者进行通信来模拟与人类用户的对话。它们是包含AI功能的计算机程序的常用接口。 Classification 分类:分类算法让机器根据训练数据为数据点分配类别。 Cluster analysis 聚类分析:一种用于探索性数据分析的无监督学习,用于查找数据中的隐藏模式或分组;群集使用由欧几里得或概率距离等度量定义的相似性度量建模。 Clustering 聚类:聚类算法允许机器将数据点或项目分组到具有相似特征的组中。 Cognitive computing 认知计算:一种模仿人类大脑思维 式的计算机模型。它涉及通过使用数据挖掘,自然语言处理和模式识别进行自学习。 七个人工智能常见术语全文共4页,当前为第2页。七个人工智能常见术语全文共4页,当前为第2页。Convolutional neural network 卷积神经网络(CNN):一种识别和理解图像的神经网络。 七个人工智能常见术语全文共4页,当前为第2页。 七个人工智能常见术语全文共4页,当前为第2页。 D Data mining 数据挖掘:检查数据集以发现和挖掘可以进一步使用的数据模式。 Data science 数据科学:一个跨学科领域,结合了统计学,信息科学和计算机科学的科学方法,系统和过程,通过结构化或非结构化数据提供对现象的洞察。 Decision tree 决策树:基于树和分支的模型,用于映射决策及其可能的后果,类似于流程图。 Deep learning 深度学习:机器通过由级联信息层组成的人工神经网络自主模仿人类思维模式的能力。 F Fluent 流畅:一种可以随时间变化的状况。 G Game AI :一种特定于游戏的AI形式,它使用算法来代替随机性。 它是非玩家角色中使用的计算行为,用于生成玩家所采取的类似人类智能和基于反应的动作。 Genetic algorithm 遗传算法:一种基于遗传学和自然选择原理的进化算法,用于寻找困难问题的最优或近似最优解,否则需要数十年才能解决。 H Heuristic search techniques 启发式搜索技术:支持通过消除不正确的选七个人工智能常见术语全文共4页,当前为第3页。七个人工智能常见术语全文共4页,当前为第3页。项来缩小搜索问题的最佳解决方案的范围。 七个人工智能常见术语全文共4页,当前为第3页。 七个人工智能常见术语全文共4页,当前为第3页。 K Knowledge engineering 知识工程:专注于构建基于知识的系统,包括其所有科学,技术和社会方面。 L Logic programming 逻辑编程:一种编程范式,其中基于事实和规则的知识库进行计算; LISP和Prolog是用于AI编程的两种逻辑编程语言。 M Machine intelligence 机器智能:一个涵盖机器学习,深度学习和经典学习算法的总称。 Machine learning 机器学习:人工智能的一个方面,专注于算法,允许机器学习而不需要编程,并在暴露于新数据时进行更改。 Machine perception 机器感知:系统接收和解释来自外部世界的数据的能力,类似于人类如何使用我们的感官。 这通常使用附加的硬件来完成,尽管软件也是可用的。 N Natural language processing 自然语言处理:程序能够识别人类交流的能力。 R Recurrent neural network 递归神经网络(RNN):一种神经网络,它能够理解顺序信息并识别模式,并根据这些计算创建输出。 S 七个人工智能常见术语全文共4页,当前为第4页。七个人工智能常见术语全文共4页,当前为第4页。Supervised learning 监督学习:一种机器学习,其中输出数据集训练机器生成所需的算法,如监督学生的教师; 比无监督学习更常见。 七个人工智能
⼈⼯智能领域的术语,主要有哪些? ⼈⼯智能不再是定义模糊的流⾏词汇,已经成为了更为精确的指代,在这样的背景下,理解⼈⼯智能领域的术语越来越成为⼀种挑战。本⽂ 就为⼤家总结⼀些⼈⼯智能领域最重要的术语。 A 算法(Algorithms):⼀组⽤于⼈⼯智能、神经⽹络或其他机器的规则或指令,以帮助它⾃⼰学习;分类、聚类、推荐和回归是四种最常 见的类型。 ⼈⼯智能(Artificialintelligence):机器模拟⼈类智⼒和⾏为做出决策、执⾏任务的能⼒。 ⼈⼯神经⽹络(ANN):这种学习模型,模拟⼈脑运作,从⽽解决传统计算机系统难以解决的任务。 ⾃主计算(Autonomiccomputing):系统⾃适应⾃我管理⾃⾝资源⽤于⾼级计算功能的能⼒,⽽⽆需⽤户输⼊。 C 聊天机器⼈(Chatbots):聊天机器⼈(简称chatbot)通过⽂本对话、语⾳命令来模拟与⼈类⽤户进⾏对话。它们是有AI功能的计算机程 序的常⽤界⾯。 分类(Classification):分类算法让机器根据训练数据给数据点进⾏分类。 聚类分析(Clusteranalysis):⼀种⽤于探索性数据分析的⽆监督学习,查找数据中的隐藏模式或分组;群集的建⽴是通过欧⽒距离 (Euclidean)或概率距离等定义的相似性度量。 聚类(Clustering):聚类算法让机器将数据点或项⽬分成具有相似特征的组。 认知计算(Cognitivecomputing):⼀种模仿⼈类⼤脑思维⽅式的计算模型。通过使⽤数据挖掘、⾃然语⾔处理和模式识别来进⾏⾃学习 (self-learning)。 卷积神经⽹络(CNN):⼀种识别和处理图像的神经⽹络。 D 数据挖掘(Datamining):通过查看数据集以发现和挖掘其中模式,从⽽进⼀步使⽤数据。 数据科学(Datascience):结合统计、信息科学、计算机科学的科学⽅法、科学系统和科学过程的交叉学科,通过结构化或⾮结构化数据 提供对现象的洞察。 决策树(Decisiontree):⼀个基于分⽀的树模型,绘制决策及其可能后果的模型图,与流程图类似。 深度学习(Deeplearning):机器通过由层叠信息层组成的⼈⼯神经⽹络⾃主模仿⼈类思维模式的能⼒。 F Fluent:⼀种可随时间变化的条件。 G 游戏AI(GameAI):使⽤算法替代随机性的⼀种适⽤于游戏的AI特定形式。这种计算⾏为⽤于⾮玩家⾓⾊(NPC),对于玩家的操作⽣成 类似⼈类的智⼒和基于反应的⾏为。 K 知识⼯程(Knowledgeengineering):侧重于建⽴以知识为基础的系统,包括科学、技术和社会在内的所有⽅⾯。 M 机器智能(Machineintelligence):涵盖机器学习、深度学习和古典学习算法在内的总括术语。 机器学习(Machinelearning):⼈⼯智能的⼀个⽅⾯,专注于算法,允许机器在不经过编程的情况下学习,并随着新数据的摄⼊⽽改变。 机器感知(Machineperception):系统接收和解释来⾃外部世界数据的能⼒,类似于⼈类使⽤感官。这通常需要借助外接硬件完成,尽 管软件也同样需要。 N ⾃然语⾔处理(Natural language processing):程序识别理解⼈类沟通的能⼒。 R 循环神经⽹络(RNN):⼀种理解顺序信息、识别模式、并根据这些计算产⽣输出的神经⽹络。 S 监督学习(Supervisedlearning):机器学习的⼀种,其输出数据集训练机器产⽣所需的算法,如⽼师监督学⽣;⽐⽆监督学习更常见。 群体⾏为(Swarmbehavior):从数学建模者的⾓度来看,这是从个体遵循的简单规则衍⽣出的新⽣⾏为,不涉及任何集中协调。 U ⽆监督学习(Unsupervisedlearning):⼀种机器学习算法,通过不带标签响应的输⼊数据组成的数据集进⾏推理。最常见的⽆监督学习 ⽅法是聚类分析。 ⼈⼯智能、⼤数据、云计算和物联⽹的未来发展值得重视,均为前沿产业,多智时代专注于⼈⼯智能和⼤数据的⼊门和科谱,在此为你推荐 ⼏篇优质好⽂: ⼈⼯智能,机器学习和深度学习之间,主要有什么差异? 如何跳出⼤数据视⾓规划⼀个标准的⼈⼯智能平台?就这么简单! 在⽹络⼤时代背景下,⼈⼯智能技术是如何应⽤的

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值