数据挖掘中各种数据类型的邻近性度量
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 独热编码处理
- 对称属性:用 hamming
- 非对称属性:用 Jaccard
-
- hamming 计算方式 - 和- 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、相关理论知识:
- 进行套路操作即可:首先进行数据表
- 独热编码处理
- 使用一种方式计算每两个对象的距离()
- 重写进行数据表
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、实现结果:
套路与总结:
- 首先先打出来数据表
- 然后观察数据,一般要实现二值化或是独热编码处理(将文本数据啥的转化为01 )
- 然后使用方法计算距离(有各种计算距离(也就是差距,邻近性度量)的方法 )
- 最后为了好看,用数据表在封装起来展示(有对象名)
- 另一方面,本章学习了两个对象之间的邻近性度量,每个对象都有特殊的数据类型,他们具体的数据是有(标称、二值、序列 、数值、混合等数据类型)
- 对于各种数据类型,有各自的距离计算方式,具体计算方式,在一开始有解释(汉明,Jaccard、曼哈顿距离、欧氏距离、切比雪夫距离、余弦相似性等等)
- 对象感觉就和向量一样