SCAU数据挖掘与数据分析——各种数据类型的邻近性度量

本文介绍了数据挖掘中针对不同数据类型(标称、二值、数值、序列和混合)的邻近性度量方法,包括欧氏距离、曼哈顿距离、切比雪夫距离、余弦相似性、Jaccard相似系数和汉明距离等,并提供了Python代码示例。文章还强调了在实际应用中选择合适度量方法的重要性。
摘要由CSDN通过智能技术生成

Readme:

  • 备注:以下代码是在Jupyter notebook上运行实现;代码主要差别就是,不用写print()
  • 本章学习了两个对象之间的邻近性度量,每个对象都有特殊的数据类型,他们具体的数据是有(标称、二值、序列 、数值、混合等数据类型)
  • 对于各种数据类型,有各自的距离计算方式,具体计算方式,在一开始有解释(汉明,Jaccard、曼哈顿距离、欧氏距离、切比雪夫距离、余弦相似性等等)
  • 对象感觉就和向量一样

知识学习:

重点:邻近性度量的方法(相似性分析、相异性)

常见的邻近性度量方法包括:

  • 曼哈顿距离(Manhattan Distance):

也称为城市街区距离,是所有维度上差的绝对值之和。
适用于数值数据,尤其当数据的各维度是独立的时,曼哈顿距离可能更合适。

  • 欧几里得距离(Euclidean Distance):

最常用的距离度量方法,用于测量多维空间中两点之间的直线距离。
适用于数值数据。
切比雪夫距离
在这里插入图片描述

  • 余弦相似性(Cosine Similarity):

测量两个向量在方向上的相似程度,与向量的大小无关。
常用于文本数据的相似性度量。

  • 杰卡德相似系数(Jaccard Similarity Coefficient):

用于比较有限样本集之间的相似性和差异性。
适用于二元数据或集合数据。

  • 汉明距离(Hamming Distance):

测量两个等长字符串之间对应位置上不同字符的个数。
适用于二元数据或分类数据。

  • 马氏距离(Mahalanobis Distance):

考虑数据的协方差,用于多变量数据中测量样本间的距离。
能够考虑数据特征之间的相关性。

在实际应用中,需要根据数据的特性和分析的目的选择合适的邻近性度量方法。例如,在处理高维数据时,可能需要选择一种能够适应数据稀疏性的相似性度量;而在处理分类数据时,可能需要使用基于计数的相似性度量,如汉明距离或杰卡德相似系数。

一、作业1:计算相异矩阵

1、题目:

在这里插入图片描述

2、相关理论知识:

  • 相异矩阵:又称做对象–对象结构,(n个对象组成的(横纵坐标都是这n个对象所以才是下三角),每个位置存储的值是所对应的两个对象-所有的属性的距离)
  • 这是 相异性差度 的度量
  • 一般需要先独热编码处理 (对于非数字类型的数据)
    在这里插入图片描述

3、python代码实现

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.metrics import pairwise_distances
import warnings
from sklearn.exceptions import DataConversionWarning
warnings.filterwarnings(action='ignore', category=DataConversionWarning)

# Given data set
data_01 = pd.DataFrame({
    '年龄': [25, 30, 28, 35],
    '性别': ['男', '女', '男', '女'],
    '收入(千美元)': [55, 65, 60, 80],
    '学历': ['本科', '硕士', '博士', '本科']
}, index=[1, 2, 3, 4])

data_01
# OneHotEncoder() 的转换构造方法
column_transformer = ColumnTransformer(
    [('category', OneHotEncoder(), ['性别', '学历'])],
    remainder='passthrough'
)

# 转化数据调用方法
data_transformed = column_transformer.fit_transform(data_01)

# 计算欧氏距离矩阵
distance_matrix = pairwise_distances(data_transformed, metric='euclidean')

# 遍历矩阵,只打印下三角部分
for i in range(len(distance_matrix)):
    for j in range(i + 1):
        if distance_matrix[i][j]!=0 :
            print(f'{distance_matrix[i][j]:.2f}', end=' ')
        else :
            print("0.0")
    print()
# 创建一个数据表来保存,当然相异矩阵可以只有下三角
distance_df = pd.DataFrame(distance_matrix, index=data_01.index, columns=data_01.index)
distance_df

4、每一步实现结果:

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

二、作业2:计算二值属性的邻近性度量(二值和非二

值——hamming和Jaccard)

1、题目:

在这里插入图片描述

2、相关理论知识:

二元属性的邻近性度量两个对象之间):
都先进行 01 独热编码处理

  1. 对称属性:用 hamming
  2. 非对称属性:用 Jaccard
    • hamming 计算方式 - 和- Jaccard 计算方式:
      在这里插入图片描述

3、python代码实现

data_02 = pd.DataFrame({'参与者ID': [1, 2, 3, 4],

'品牌A': ['喜欢', '不喜欢', '喜欢', '不喜欢'],

'品牌B': ['不喜欢', '喜欢', '喜欢', '不喜欢'],

'品牌C': ['不喜欢', '喜欢', '不喜欢', '喜欢'],

'品牌D': ['喜欢', '不喜欢', '喜欢', '不喜欢']})
data_02.set_index('参与者ID', inplace=True)
data_02
# 将喜欢和不喜欢转换为1和0(等效于独热编码处理)
data_02_binary = data_02.replace({'喜欢': 1, '不喜欢': 0})
data_02_binary
# pairwise_distance 来计算距离
encoded_data_02_hamming_matrix = pairwise_distances(data_02_binary, metric='hamming')
encoded_data_02_hamming_matrix
# 存储在数据表中
distance_df = pd.DataFrame(encoded_data_02_hamming_matrix, index=data_02.index, columns=data_02.index)
distance_df
# 计算非对称二值的距离Jaccard
encoded_data_02_Jaccard_matrix = pairwise_distances(data_02_binary.to_numpy(), metric='jaccard')
encoded_data_02_Jaccard_matrix
# 存储在数据表中
distance_df = pd.DataFrame(encoded_data_02_Jaccard_matrix, index=data_02.index, columns=data_02.index)
distance_df

4、每一步实现结果:

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

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

三、作业3:

1、题目:

在这里插入图片描述

2、相关理论知识:

数值属性的邻近性度量:三种主要的计算距离的方式:
在这里插入图片描述

3、python代码实现

data_03 = pd.DataFrame({'参与者ID': [1, 2, 3, 4],

'年龄': [25, 30, 28, 35],

'收入(千美元)': [50, 60, 55, 70]})
data_03.set_index('参与者ID', inplace=True)
data_03
# 曼哈顿距离
manhattan_distances = pairwise_distances(data_03, metric='manhattan')
manhattan_distances
# 存储在数据表中
distance_df = pd.DataFrame(manhattan_distances, index=data_03.index, columns=data_03.index)
distance_df
# 欧式距离
euclidean_distances = pairwise_distances(data_03, metric='euclidean')
euclidean_distances
# 存储在数据表中
distance_df = pd.DataFrame(euclidean_distances, index=data_03.index, columns=data_03.index)
distance_df

# 切比雪夫距离,找一个最大max|xi-yi|
chebyshev_distances = pairwise_distances(data_03, metric='chebyshev')
chebyshev_distances
# 存储在数据表中
distance_df = pd.DataFrame(chebyshev_distances, index=data_03.index, columns=data_03.index)
distance_df

4、每一步实现结果:

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

在这里插入图片描述

四、作业4:混合类型属性的邻近性度量

1、题目:

在这里插入图片描述

2、相关理论知识:

  1. 进行套路操作即可:首先进行数据表
  2. 独热编码处理
  3. 使用一种方式计算每两个对象的距离()
  4. 重写进行数据表

3、python代码实现

data_04 = pd.DataFrame({'参与者ID': [1, 2, 3, 4],

'年龄': [25, 30, 28, 35],

'性别': ['男', '女', '男', '女'],

'收入(千美元)': [50, 60, 55, 70]})
data_04.set_index('参与者ID', inplace=True)
data_04
# OneHotEncoder() 的转换构造方法
column_transformer = ColumnTransformer(
    [('category', OneHotEncoder(), ['性别'])],
    remainder='passthrough'
)

# 转化数据调用方法
data_transformed = column_transformer.fit_transform(data_04)
data_transformed
# 计算距离
distance_matrix = pairwise_distances(data_transformed,
metric='euclidean')
distance_matrix
# 存储在数据表中
distance_df = pd.DataFrame(distance_matrix, index=data_04.index, columns=data_04.index)
distance_df

4、每一步实现结果:

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

在这里插入图片描述

五、作业5:实现以下二个文档的余弦相似性:

1、题目:

在这里插入图片描述

2、相关理论知识:

在这里插入图片描述

3、python代码实现

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


with open(r"cos2.txt", "r", encoding="utf-8") as file:
    cos1_text = file.read()

with open(r"cos1.txt", "r", encoding="utf-8") as file:
    cos2_text = file.read()
    
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform([cos1_text, cos2_text])
cosine_sim = cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])
print("余弦相似性:")
print(cosine_sim[0][0])

4、实现结果:

在这里插入图片描述

套路与总结:

  1. 首先先打出来数据表
  2. 然后观察数据,一般要实现二值化或是独热编码处理(将文本数据啥的转化为01 )
  3. 然后使用方法计算距离(有各种计算距离(也就是差距,邻近性度量)的方法 )
  4. 最后为了好看,用数据表在封装起来展示(有对象名)
  • 另一方面,本章学习了两个对象之间的邻近性度量,每个对象都有特殊的数据类型,他们具体的数据是有(标称、二值、序列 、数值、混合等数据类型)
  • 对于各种数据类型,有各自的距离计算方式,具体计算方式,在一开始有解释(汉明,Jaccard、曼哈顿距离、欧氏距离、切比雪夫距离、余弦相似性等等)
  • 对象感觉就和向量一样
  • 30
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值