基于多变量人员数据集创建相似度heatmap的技术实现咨询
基于多变量人员数据集创建相似度heatmap的技术实现咨询
嘿,我来帮你搞定这个相似度热力图的问题!你的需求很清晰——根据Salary、GPA、IQ三个变量的匹配数量来定义人员间的相似度,完全匹配三个变量得1,匹配两个用另一种颜色区分,对吧?下面用Python来实现,步骤直观易懂:
第一步:把你的数据集整理成可处理的格式
首先我们用pandas把你给出的表格转成DataFrame,方便后续操作:
import pandas as pd # 把你提供的数据转换成字典格式 data = { 'Person': ['Alisson', 'Simon', 'Michael', 'Dani', 'Brian', 'David', 'Ilan', 'Juan', 'Julius', 'Philipp', 'Joshua', 'Rick', 'Moises', 'Fabian', 'Isaac', 'Kurt'], 'Salary': [1, 1, 2, 2, 1, 1, 1, 2, 3, 3, 2, 2, 3, 3, 2, 2], 'GPA': [1, 2, 3, 1, 2, 1, 1, 1, 3, 3, 1, 1, 1, 1, 2, 2], 'IQ': [1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 1, 1, 1, 1, 2] } df = pd.DataFrame(data)
第二步:计算人员间的相似度矩阵
接下来我们要写一个小函数,用来计算任意两个人之间的相似度——统计三个变量中匹配的数量,再转换成你想要的比例(比如完全匹配3个得1,匹配2个得约0.67,这样数值和颜色对应更直观)。然后用这个函数填充一个相似度矩阵:
import numpy as np def get_similarity(row_a, row_b): # 统计三个变量中相等的个数 matched = sum([row_a[col] == row_b[col] for col in ['Salary', 'GPA', 'IQ']]) # 转换成0-1之间的相似度值,你也可以直接返回匹配数量(3/2/1/0) return matched / 3 # 创建空的相似度矩阵,大小和人员数量一致 similarity_matrix = np.zeros((len(df), len(df))) # 遍历填充矩阵 for i in range(len(df)): for j in range(len(df)): similarity_matrix[i][j] = get_similarity(df.iloc[i], df.iloc[j]) # 把矩阵转成带人名索引的DataFrame,方便后续绘图 similarity_df = pd.DataFrame(similarity_matrix, index=df['Person'], columns=df['Person'])
第三步:绘制相似度热力图
最后用seaborn库来画热力图,它能自动根据相似度值分配颜色,还可以显示每个单元格的具体数值:
import seaborn as sns import matplotlib.pyplot as plt # 设置画布大小,避免人名挤在一起 plt.figure(figsize=(12, 10)) # 绘制热力图:annot=True显示数值,cmap选颜色映射(viridis是很常用的配色),vmin/vmax限定数值范围 sns.heatmap(similarity_df, annot=True, cmap='viridis', vmin=0, vmax=1) # 给热力图加标题 plt.title('Person Similarity Heatmap (Based on Salary, GPA, IQ)') # 显示图形 plt.show()
效果说明
- 完全匹配三个变量的单元格会显示1,颜色最深(或最亮,取决于你选的colormap)
- 匹配两个变量的单元格显示约0.67,颜色次之
- 匹配1个或0个的单元格颜色会更浅,一眼就能区分出来
如果你不想用比例值,直接用匹配的数量(3/2/1/0)作为相似度也可以,只要修改get_similarity函数的返回值为matched就行,热力图的颜色依然会自动区分不同的匹配等级。
备注:内容来源于stack exchange,提问作者user20378009
相关产品推荐
相关产品推荐

