跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 数据分析:学生画像匹配与相似度计算

通过学生成绩与课程评价案例,讲解 Python 中三种相似性度量方法。涵盖欧氏距离、曼哈顿距离及余弦相似度。数值特征常用距离衡量差异,文本数据侧重向量方向比较。提供完整代码示例展示数学计算与库函数实现,适用于推荐系统、聚类分析及用户画像匹配场景。

孤勇者发布于 2026/3/22更新于 2026/9/959 浏览

Python 数据分析:学生画像匹配与相似度计算

在数据分析和机器学习中,我们经常会遇到这样的问题:

  • 如何判断两个学生的学习习惯是否相似?
  • 如何衡量两个商品是不是'同类竞品'?
  • 为什么推荐系统能给你推送'你可能喜欢'的内容?
  • 两段文本内容相似,应该怎么用数据来表示?

这些问题,归根到底,都指向一个核心概念:

相似性度量

本文将通过'学生画像匹配'和'课程评价文本分析'两个小案例,带你理解下面几个非常常用的概念:

  • 欧氏距离(Euclidean Distance)
  • 曼哈顿距离(Manhattan Distance)
  • 余弦相似度(Cosine Similarity)

并结合 Python 完成简单实战。


一、案例引入:谁和你最像?

假设我们想根据学生的学习数据,寻找'和你最相似的同学'。

比如现在有三位学生的成绩数据:

学生数学英语
A8085
B8288
C6070

问题来了:

  • A 和 B 谁更像?
  • A 和 C 谁更像?
  • 我们能不能不用'感觉',而是用'计算'来判断?

答案是可以的。

在数据世界里,'相似'是可以被量化的。一种最直接的想法就是:

谁和 A 的'距离'更近,谁就更相似。


二、什么是相似性?什么是距离?

在数据分析里,经常会把'相似性'和'距离'放在一起讲。

你可以简单理解为:

  • 距离越小,两个对象越相似
  • 距离越大,两个对象差异越大

这种思路在很多应用里都非常常见,比如:

  • 推荐系统
  • 用户画像匹配
  • 聚类分析
  • 离群点分析

数据对象的相似性度量正是这些分析任务的重要基础。


三、欧氏距离:最常见的'直线距离'

欧氏距离,就是我们在几何中最熟悉的'两点之间的直线距离'。

如果两个学生用两个特征表示:

  • 数学成绩
  • 英语成绩

那么就可以把每个学生看成二维平面上的一个点。

例如:

  • A = (80, 85)
  • B = (82, 88)
  • C = (60, 70)
欧氏距离公式

对于两个点:

A =(x1, y1) B =(x2, y2)

欧氏距离为:

d = ((x2 - x1)^+(y2 - x1)^)
sqrt
2
2

如果扩展到多个特征,也是同样思路:各维度差值平方后求和,再开方。


四、手工算一遍:A 和谁更相似?

1)A 和 B 的欧氏距离
A =(80,85) B =(82,88)

计算过程:

d(A,B)= sqrt((82-80)^2+(88-85)^2)= sqrt(2^2+3^2)= sqrt(4+9)= sqrt(13) ≈ 3.61
2)A 和 C 的欧氏距离
A =(80,85) C =(60,70)

计算过程:

d(A,C)= sqrt((60-80)^2+(70-85)^2)= sqrt((-20)^2+(-15)^2)= sqrt(400+225)= sqrt(625)=25
3)结论

因为:

d(A,B)=3.61< d(A,C)=25

所以:

学生 B 与学生 A 更相似。

这就是'距离越小,相似度越高'的最直观体现。


五、用 Python 计算欧氏距离

下面我们用 Python 实现刚才的计算。

import math

A = (80, 85)
B = (82, 88)
C = (60, 70)

def euclidean_distance(p1, p2):
    return math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)

dist_ab = euclidean_distance(A, B)
dist_ac = euclidean_distance(A, C)
print("A 与 B 的欧氏距离:", dist_ab)
print("A 与 C 的欧氏距离:", dist_ac)

输出结果:

A 与 B 的欧氏距离:3.605551275463989
A 与 C 的欧氏距离:25.0

如果你想让结果更美观一点,可以保留两位小数:

print("A 与 B 的欧氏距离:{:.2f}".format(dist_ab))
print("A 与 C 的欧氏距离:{:.2f}".format(dist_ac))

六、曼哈顿距离:不是走直线,而是'走格子'

除了欧氏距离,还有一种很常见的距离叫 曼哈顿距离。

它的名字来源于美国曼哈顿的街区布局:如果你只能沿着街道走,而不能斜着穿过去,那么你的路径就不是直线,而是'横着走 + 竖着走'。

曼哈顿距离公式
d =|x2 - x1|+|y2 - y1|
例子:A 和 B 的曼哈顿距离
A =(80,85) B =(82,88)
d(A,B)=|82-80|+|88-85|=2+3=5
Python 实现
def manhattan_distance(p1, p2):
    return abs(p1[0] - p2[0]) + abs(p1[1] - p2[1])

dist_ab_manhattan = manhattan_distance(A, B)
dist_ac_manhattan = manhattan_distance(A, C)
print("A 与 B 的曼哈顿距离:", dist_ab_manhattan)
print("A 与 C 的曼哈顿距离:", dist_ac_manhattan)
如何理解?
  • 欧氏距离:看'直线有多远'
  • 曼哈顿距离:看'按坐标轴走要走多远'

两者都能衡量差异,只是方式不同。


七、余弦相似度:比较的不是远近,而是方向

前面的欧氏距离和曼哈顿距离,主要适合数值型特征。

但如果面对的是文本数据,比如两段课程评价、两篇文章、两个商品描述,该怎么办?

这时候,一个很常用的方法就是:

余弦相似度(Cosine Similarity)

余弦相似性常用于文档数据的相似度测量,一般通过关键词向量来表示文档特征。


八、为什么文本可以变成向量?

举个例子,假设我们有两段课程评价:

评价 1

'老师讲课清晰,案例很多,课堂有趣'

评价 2

'讲课清晰,案例丰富,课堂生动'

我们可以先提取关键词,比如:

  • 讲课
  • 清晰
  • 案例
  • 课堂
  • 有趣
  • 丰富
  • 生动

然后统计每个词出现的次数,把它变成一个向量。

例如:

评价 1=[1,1,1,1,1,0,0]
评价 2=[1,1,1,1,0,1,1]

这样,文本相似度问题就变成了'两个向量是否相似'的问题。


九、余弦相似度公式

余弦相似度的核心思想是:

比较两个向量的方向是否接近,而不是比较长度是否相同。

公式如下:

cos(theta)=(A · B)/(||A||*||B||)

你可以简单理解为:

  • 结果越接近 1:越相似
  • 结果越接近 0:越不相似
  • 结果越接近 -1:方向相反

在文本分析场景里,我们通常最关注:

余弦相似度越接近 1,文本内容越相似。


十、用 Python 计算余弦相似度

import numpy as np

vec1 = np.array([1,1,1,1,1,0,0])
vec2 = np.array([1,1,1,1,0,1,1])

cos_sim = np.dot(vec1, vec2)/(np.linalg.norm(vec1)* np.linalg.norm(vec2))
print("余弦相似度:", cos_sim)

如果结果接近 1,说明两段评价内容比较相似。


十一、完整代码:欧氏距离 + 曼哈顿距离 + 余弦相似度

下面给出一份完整代码,复制即可运行。

import math
import numpy as np

# ======================
# 1. 欧氏距离与曼哈顿距离
# ======================
A = (80, 85)
B = (82, 88)
C = (60, 70)

def euclidean_distance(p1, p2):
    return math.sqrt(sum((a - b)**2 for a, b in zip(p1, p2)))

def manhattan_distance(p1, p2):
    return sum(abs(a - b) for a, b in zip(p1, p2))

print("=== 数值数据相似性分析 ===")
print("A 与 B 的欧氏距离:{:.2f}".format(euclidean_distance(A, B)))
print("A 与 C 的欧氏距离:{:.2f}".format(euclidean_distance(A, C)))
print("A 与 B 的曼哈顿距离:", manhattan_distance(A, B))
print("A 与 C 的曼哈顿距离:", manhattan_distance(A, C))

# ======================
# 2. 余弦相似度
# ======================
vec1 = np.array([1,1,1,1,1,0,0])
vec2 = np.array([1,1,1,1,0,1,1])

cos_sim = np.dot(vec1, vec2)/(np.linalg.norm(vec1)* np.linalg.norm(vec2))
print("\n=== 文本相似性分析 ===")
print("两段评价的余弦相似度:{:.4f}".format(cos_sim))

十二、这三种方法分别适合什么场景?

1. 欧氏距离

适合:

  • 学生成绩比较
  • 用户数值特征匹配
  • 商品数值属性比较

特点:

  • 最直观
  • 最常用
  • 适合连续数值型数据
2. 曼哈顿距离

适合:

  • 网格路径问题
  • 某些高维特征场景
  • 与欧氏距离做对比分析

特点:

  • 强调各维度差值之和
  • 对坐标轴变化更敏感
3. 余弦相似度

适合:

  • 文本相似度分析
  • 推荐系统
  • 关键词向量比较

特点:

  • 比较方向
  • 不强调绝对大小
  • 文档数据很常用

十三、最容易踩的坑

坑 1:把'相似度'和'距离'混为一谈

要记住:

  • 距离越小,相似度越高
  • 相似度越大,对象越接近

两者方向相反,但本质都在衡量'像不像'。

坑 2:以为余弦相似度比较的是'距离远近'

不是。

余弦相似度比较的是:

方向是否一致

即使两个向量长度不一样,只要方向接近,余弦相似度也可能很高。

坑 3:所有数据都直接算欧氏距离

不一定合适。

如果是文本数据,欧氏距离通常不是首选,余弦相似度更常见。

坑 4:忽略特征维度的含义

比如学生画像中,如果一个特征是'成绩',另一个特征是'消费金额',量纲差异很大,直接计算距离可能不合理。实际应用中,往往还需要做标准化处理。


十四、这部分知识有什么实际用途?

相似性度量在很多数据分析任务中都非常重要,例如:

  • 聚类分析
  • 推荐系统
  • 用户画像匹配
  • 文本相似度分析
  • 离群点分析

数据对象的相似性度量正是这些应用的重要基础。

也就是说:

只要你需要比较'两个对象像不像',相似性度量就一定用得上。


十五、给初学者的记忆口诀

这部分内容你可以先记住这 4 句话:

  1. 欧氏距离:看直线距离,越小越相似。
  2. 曼哈顿距离:看网格路径距离。
  3. 余弦相似度:看方向相似,越接近 1 越相似。
  4. 数值数据常看距离,文本数据常看余弦相似度。

十六、课后练习

练习 1:基础题

已知三位学生成绩如下:

学生数学英语
A7580
B7882
C6065

请完成:

  1. 计算 A 与 B 的欧氏距离
  2. 计算 A 与 C 的欧氏距离
  3. 判断谁与 A 更相似
练习 2:提高题

请继续完成:

  1. 计算 A 与 B 的曼哈顿距离
  2. 计算 A 与 C 的曼哈顿距离
  3. 对比欧氏距离和曼哈顿距离的结果,有什么共同点?
练习 3:迁移题

假设两段课程评价转成关键词向量后如下:

vec1 =[1,1,0,1,0]
vec2 =[1,0,1,1,0]

请完成:

  1. 使用 Python 计算余弦相似度
  2. 判断两段评价是否相似
  3. 思考:为什么文本分析中常使用余弦相似度,而不是欧氏距离?

十七、总结

这篇文章主要解决了一个非常核心的问题:

在数据世界里,如何判断两个对象是否相似?

我们通过'学生画像匹配'和'课程评价文本分析'两个案例,学习了:

  • 欧氏距离
  • 曼哈顿距离
  • 余弦相似度

其中最重要的结论是:

  • 数值特征之间,常用距离来衡量差异
  • 文本特征之间,常用余弦相似度来衡量方向相似性
  • 相似性度量是推荐系统、聚类分析和文本分析的重要基础

目录

  1. Python 数据分析:学生画像匹配与相似度计算
  2. 一、案例引入:谁和你最像?
  3. 二、什么是相似性?什么是距离?
  4. 三、欧氏距离:最常见的“直线距离”
  5. 欧氏距离公式
  6. 四、手工算一遍:A 和谁更相似?
  7. 1)A 和 B 的欧氏距离
  8. 2)A 和 C 的欧氏距离
  9. 3)结论
  10. 五、用 Python 计算欧氏距离
  11. 六、曼哈顿距离:不是走直线,而是“走格子”
  12. 曼哈顿距离公式
  13. 例子:A 和 B 的曼哈顿距离
  14. Python 实现
  15. 如何理解?
  16. 七、余弦相似度:比较的不是远近,而是方向
  17. 八、为什么文本可以变成向量?
  18. 评价 1
  19. 评价 2
  20. 九、余弦相似度公式
  21. 十、用 Python 计算余弦相似度
  22. 十一、完整代码:欧氏距离 + 曼哈顿距离 + 余弦相似度
  23. ======================
  24. 1. 欧氏距离与曼哈顿距离
  25. ======================
  26. ======================
  27. 2. 余弦相似度
  28. ======================
  29. 十二、这三种方法分别适合什么场景?
  30. 1. 欧氏距离
  31. 2. 曼哈顿距离
  32. 3. 余弦相似度
  33. 十三、最容易踩的坑
  34. 坑 1:把“相似度”和“距离”混为一谈
  35. 坑 2:以为余弦相似度比较的是“距离远近”
  36. 坑 3:所有数据都直接算欧氏距离
  37. 坑 4:忽略特征维度的含义
  38. 十四、这部分知识有什么实际用途?
  39. 十五、给初学者的记忆口诀
  40. 十六、课后练习
  41. 练习 1:基础题
  42. 练习 2:提高题
  43. 练习 3:迁移题
  44. 十七、总结

更多推荐文章

查看全部
  • 飞算 JavaAI 专业版实测:全栈代码生成与开发效率提升
  • Clawdbot 镜像免配部署 Qwen3-32B:Web 网关直连方案
  • OpenAI Whisper 音频转录指南
  • 深度剖析 HashMap:从 JDK 1.7 死循环到 1.8 高低位映射优化
  • 构建基于 Rust 与 GLM-5 的高性能 AI 翻译 CLI 工具
  • 使用 OpenCV 进行相机校准与畸变校正
  • 基于 AI 的论文降重与 AIGC 检测技术分析
  • OXC 工具发布:前端格式化与 Lint 性能大幅提升
  • 前端 JS 资源加载失败怎么办?重试与多源容灾方案实战
  • Qt Creator 在 CentOS 7 下无法显示项目文件树(Headers/Sources 等缺失)
  • 月薪 30K 以上程序员的必备特征与核心能力
  • 规则引擎详解:概念、作用、场景、痛点与主流开源方案对比
  • Codex 接入 Kimi K2 与 GLM-4.6 环境配置指南 (Windows/macOS/Ubuntu)
  • OpenClaw 开源 AI 助手中文发行版部署指南:一键脚本/Docker/npm 安装
  • 国产多模态大模型 InternLM-XComposer 2.5 升级,原生支持 24K 图文上下文
  • Qwen-Image-Lightning 本地部署与实战指南
  • DeepSeek 隐藏玩法与高阶提示词使用指南
  • Apache IoTDB 时序数据库架构优势与选型指南
  • Mac 下 Neo4j 图数据库安装与基础操作指南
  • Python 基础练习题精选与解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online