1. 这篇毕设真正要解决的,不是“聚类”而是“分层”
很多人在选这个题目时会下意识地把它归类为“算法实现类”毕业设计——用k-means跑一遍数据,画出簇状图,论文里贴几张可视化截图,然后答辩时讲一讲原理就完事了。但我做了这么多年大数据相关项目之后,想先泼一盆冷水:如果只是把开源库里的KMeans.fit()调用一遍,这个毕设的含金量基本等同于一次课后作业。
中老年高血压人群分析系统这个题目,核心价值从来不在算法本身,而在于“分析”这两个字带来的业务闭环能力。也就是说,系统不只是要回答“这些患者能分成几类”,还要回答“每一类人有什么特征、和疾病风险有什么关联、后续健康干预应该怎么差异化”这类实际决策问题。k-means在这里是中间环节,不是终点。
从项目场景来看,这属于典型的医疗健康大数据方向,恰好是当前数据科学与大数据技术专业就业市场里相当吃香的领域。医疗数据的特殊性在于:维度高(生理指标、生活习惯、病史、用药记录)、噪声大(医院采集标准不一、问卷回填随意)、隐私要求严格(脱敏处理是前置条件)。这三点决定了你从选题到交付的每一个环节,都要围绕“数据能不能支撑结论”来思考,而不是围绕“模型跑得漂不漂亮”来思考。
站在毕设立项的角度,我建议把题目隐含的三个模块拆解清楚:
- 数据层:构建一个高血压人群的数据集,包含必要的生理指标和生活习惯字段。
- 算法层:基于k-means完成人群分群,并对聚类结果做可解释性分析。
- 应用层:以Web系统或可视化大屏的方式,让医生、公共卫生管理人员或普通用户能直观地看到分群结果和决策建议。
这三层加在一起才配得上“分析系统”这个定位。如果你只做前两层,题目应该叫“基于k-means的中老年高血压人群数据聚类研究”;只有把第三层做出来,才能叫“系统”。这也是答辩时最容易向评委展示“工作量充足”的地方。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据是分析系统的命门:字段设计、获取来源与预处理实战
2.1 常见数据来源与一个诚实的建议
做医疗健康分析,最理想的数据源是合作医院的体检数据库或电子病历库。但对绝大多数本科生而言,这条路走不通——医院不可能因为一个毕设开放真实患者数据,即便脱敏也不行。退而求其次的现实方案有三条:
第一,公开医学数据集。 国际上比较知名的有MIMIC-III/IV(重症监护数据库,需要认证申请)、NHANES(美国国家健康与营养调查,包含血压、血脂、生活习惯、年龄分层等完整字段),国内也有部分高校和研究机构发布的共享数据。NHANES对毕设来说尤其友好,数据量大、字段维度全、支持按年龄筛选出中老年亚群。
第二,自建模拟数据集。 这不是让你随意编造,而是参照医学统计报告中高血压人群的分布规律(例如收缩压多集中在140-180mmHg区间、男女比例接近、合并症发生率等),用Python的numpy和faker生成几千条近似真实分布的数据。这种做法在毕设中完全站得住脚,前提是论文里必须明确交代“数据来自模拟生成,分布参照XX文献”,否则就有学术不端的嫌疑。
第三,爬虫采集公开健康资讯平台上的匿名体检数据或健康问卷数据。 这条路线合规风险较高且数据质量难以保证,我个人的建议是别碰。
2.2 字段设计:聚类不是字段越多越好
医学健康领域的聚类和电商用户分群有个本质区别:电商可以堆上百个行为特征让模型去“自动发现规律”,但医疗数据如果塞入过多无效或强相关字段,k-means的结果会变得极其不稳定,而且难以解释。
以一个用于高血压人群分群的数据集为例,我建议核心字段控制在10个以内,并且明确它们的角色:
| 字段类别 | 字段名 | 数据类型 | 说明 |
|---|---|---|---|
| 基础属性 | 年龄 | int | 建议筛选45-80岁区间 |
| 基础属性 | 性别 | int(0/1) | 独热前的类别编码 |
| 生理指标 | 收缩压 | float | 关键特征 |
| 生理指标 | 舒张压 | float | 关键特征 |
| 生理指标 | 空腹血糖 | float | 反映代谢状况 |
| 生理指标 | 总胆固醇 | float | 反映血脂状况 |
| 生理指标 | BMI | float | 由身高体重计算 |
| 生活习惯 | 吸烟史 | int(0/1) | 是/否 |
| 生活习惯 | 饮酒史 | int(0/1) | 是/否 |
| 生活习惯 | 运动频率 | int(1-5) | 每周运动次数分档 |
为什么强调字段不要贪多?你可以做一个小实验:在同样的数据里分别放入“是否服用降压药”和“服药依从性评分”这两个高度相关字段,再看聚类后的轮廓系数,往往会出现明显下降。原因是k-means使用欧氏距离度量样本相似性,高度相关的字段相当于偷偷加了两倍的权重,让聚类结果被这一组信息主导,而不是被全局信息主导。这个点如果你能在答辩时主动讲出来,评委通常会认可你“真正理解了聚类”而不是只会调库。
2.3 预处理环节:异常值、缺失值与标准化
数据预处理是整个流程里最琐碎、最不讨好、但直接影响聚类质量的部分。我按自己的实操顺序给你拆开讲。
缺失值处理: 医疗数据很少是整整齐齐的,尤其问卷调查部分,漏填率动不动就超过15%。我的处理顺序是:先看缺失比例,超过40%的字段直接丢弃;对低于40%的数字型字段,用中位数填充(因为医学指标多偏态分布,中位数比均值更稳健);对分类型字段用众数填充。有些论文喜欢在这时候套用多重插补法,对毕设来说意义不大,中位数和众数足够用了。
异常值检测: 血压数据里偶尔会出现收缩压250mmHg这种极端值,可能是录入错误,也可能是真实的重度高血压患者。处理逻辑不要一刀切,建议用IQR(四分位距)方法标出异常值,然后逐个判断。Q1 - 1.5 * IQR到Q3 + 1.5 * IQR区间之外的值,如果在临床上说得通(比如收缩压230mmHg的重症患者),就保留;如果纯属录入错误(比如身高填成1.7cm),才进行修正或剔除。
标准化这一步绝对不能省。 很多初学者上来就KMeans(n_clusters=3).fit(data),跑完发现聚类结果总被“收缩压”这一个字段主导——因为收缩压的数值范围是120-180,而运动频率只有1-5,欧氏距离计算时数值范围大的维度天然拥有更高话语权。解决办法是用StandardScaler做Z-score标准化,让所有特征均值为0、方差为1,表达式是z = (x - μ) / σ。这一步做完再送进模型,每个特征才真正处于“平等对话”的位置。
预处理部分我建议你做一个简单的数据质量面板展示在系统里,比如每条数据的缺失标记、异常标记和清洗前后的对比。这既是系统的一个功能模块,也是论文里体现“数据治理能力”的实打实证据。
2.4 一个人人都容易忽略的坑:数据漂移与人群筛选
还有个细节特别容易被忽略:你的研究对象是“中老年高血压人群”,那么在做筛选时,是只筛确诊患者,还是把血压偏高但未确诊的老人也算进来?
我的建议是要么明确筛出已确诊人群,要么对“高血压风险人群”做一次转义。因为k-means是无监督算法,它不会自动告诉你哪一类属于高血压患者,哪一类属于健康人——如果你把全部中老年体检数据丢进去,聚类结果里可能某个簇恰好对应高龄重度患者群体,另一个簇对应相对健康人群,但这是数据本身驱动的,不是你先验指定的。这个差别直接决定你论文里的措辞和问题定义。
3. k-means选型与调参深水区:K值怎么定、初始化怎么玩、评估指标怎么看
3.1 为什么是k-means?和其他聚类算法的对比
毕设题目直接指定了k-means,但答辩时评委几乎一定会问:“你为什么选k-means,而不是DBSCAN或层次聚类?”这个问题回答得好不好,决定了技术分的高下。
我给出一套稳妥的回答逻辑:
- 可解释性要求高。 医疗分析场景需要向非技术人员交代“这个簇意味着什么”,k-means的每个簇可以由质心(中心点)直观描述,医生能看懂“簇0的平均年龄70岁、收缩压162mmHg、空腹血糖偏高”这样的输出。而DBSCAN产生的噪声点和任意形状簇,在医学解释上会非常吃力。
- 数据规模与效率匹配。 k-means的时间复杂度是O(n * k * t),n是样本数、k是簇数、t是迭代次数,对万级以下的数据基本毫秒级完成。层次聚类的复杂度是O(n² log n),数据量一大就顶不住了。
- 假设前提可满足。 k-means假设簇是凸的、各向同性、大小相近的,这个假设在标准化后的生理指标数据上基本成立。
| 对比维度 | k-means | DBSCAN | 层次聚类 |
|---|---|---|---|
| 可解释性 | 强,质心可直接描述 | 弱,噪声点语义模糊 | 中等,依赖树状图解读 |
| 参数敏感性 | 高,需提前定K | 中等,需调eps和min_samples | 低,但需选链接准则 |
| 处理凸簇 | 优秀 | 一般 | 好 |
| 处理任意形状簇 | 差 | 优秀 | 好 |
| 大数据规模化 | 优秀 | 一般 | 差 |
把这张表背下来,然后结合医疗场景的需求重点讲“可解释性”这一行,比你背十遍算法的数学公式都管用。
3.2 K值选择:肘部法则和轮廓系数要一起用
K值选择是k-means里最容易翻车的一环。单一的肘部法则经常出现“肘部不明显”的情况——尤其是医疗数据本身聚类边界模糊,SSE曲线往往是一条平滑下降的曲线,你想要的那个“拐点”根本不存在。我的实操组合拳是:
第一步,肘部法则粗筛。 把K从2跑到10,对每个K记录簇内误差平方和(SSE),然后画出折线图。理论上在某个K处SSE下降幅度骤减,形成一个“肘部”,这个位置就是合理的K。如果曲线全程平滑下降,不要死磕“肘部”,直接进入第二步。
第二步,轮廓系数(Silhouette Coefficient)细选。 轮廓系数的取值区间是[-1, 1],越接近1说明样本离自己簇的距离越近、离最近邻簇越远,聚类效果越好。对每个候选K计算平均轮廓系数,通常取系数最大的K值。轮廓系数的计算表达式是(b - a) / max(a, b),其中a是样本与同簇其他样本的平均距离,b是样本与最近的其他簇中所有样本的平均距离。
第三步,业务合理性校验。 这是很多人忽略的。聚类结果不是数学题,K=5虽然数学指标最好,但如果分出来的某一类只有20个人,或者某一类在临床上毫无区分度,这个K就要放弃。对高血压人群来说,通常K=3或K=4最常见——比如“轻度风险组(年轻老人、血压轻微升高、生活习惯较好)”“中度风险组(血压中高度升高、有吸烟饮酒史、运动不足)”“重度风险组(高龄、血压重度升高、多项指标异常)”。如果K=5能拆出更多有解释力的亚型当然更好,但前提是每一簇都能讲出清晰的临床故事。
3.3 初始化陷阱:k-means++不是可选项
原始k-means用的是随机初始化质心,每一次跑出来的结果可能都不一样,甚至会出现某个簇为空的情况。你想想,如果毕设系统里的聚类结果今天跑一个样、明天跑一个样,评委现场演示时翻车,那场面会有多尴尬。
解决办法是使用k-means++初始化策略。它的核心思想是:第一个质心随机选择,后续每个质心尽量选择离已有质心远的点。这样做可以显著降低初始点选取不佳的概率,让聚类结果稳定复现。sklearn里KMeans(n_clusters=3, init='k-means++', random_state=42)两行代码的事,但在论文里要把它当做一个优化点正式写进去——为什么默认的随机初始化不稳定、k-means++如何解决、稳定性如何验证(同一数据集上多次运行打标一致性超过95%),这些内容都能体现你对算法细节的把控。
3.4 聚类评估不是只有轮廓系数
我见过不少毕设论文,评估聚类效果就放一张轮廓系数就完事了。实际上,评估维度至少应该是三层:
- 内部评估: 轮廓系数、Davies-Bouldin指数(越小越好)、Calinski-Harabasz指数(越大越好)。三个指标互相佐证,避免单一指标被骗。
- 稳定性评估: 对同一数据集使用不同随机种子反复跑,检查样本的分簇标签一致性。这个可以用调整兰德指数(ARI)来度量。
- 业务评估: 每一簇的临床特征描述是否清晰、是否能为后续决策提供差异化的输出。这一步没有标准数学指标,靠领域知识判断。
4. 从数据集到可视化大屏:系统架构与完整实现链路
4.1 系统总体架构:四层结构让代码不失控
做毕设系统,最大的风险是写着写着把自己绕晕。我建议在动手写代码之前,先在论文或者设计文档里明确系统分层,然后严格按层开发。
我采用的架构是标准的大数据Web系统四层模型:
存储层:MySQL(元数据、用户信息、原始数据集)+ CSV/Parquet文件(算法输入输出)。
服务层:Python Flask或FastAPI。 作为算法与前端之间的桥梁,提供数据处理接口、聚类分析接口、可视化数据接口。
算法层:scikit-learn实现k-means核心算法,pandas负责数据清洗和特征工程,输出内容包括分簇标签、质心坐标、评估指标。
展示层:Vue.js + ECharts。 使用ECharts渲染散点图(PCA降维后的分群可视化)、雷达图(各簇生理指标对比)、柱状图(各簇人群规模),配一个简洁的管理后台。
为什么不用更重的Hadoop/Spark体系?如果非要在毕设里硬上pySpark跑k-means,徒增部署复杂度不说,对几千条或几万条数据来说纯属杀鸡用牛刀。但这里有个灵活处理:系统设计上保留数据量扩展接口,比如当数据量超过一定阈值时自动切换Spark MLlib跑聚类。答辩时讲清楚这个设计意图,评委也不会揪着“没上分布式大数据框架”这个点不放。
4.2 核心算法代码框架:从预处理到聚类一次跑通
我直接给你一个可落地的核心代码骨架,方便参考改造。注意,这里的重点是流程完整度和关键参数设置,具体字段需结合你的数据集微调。
python复制import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, davies_bouldin_score, calinski_harabasz_score
from sklearn.decomposition import PCA
# 1. 数据读取与列筛选
df = pd.read_csv('hypertension_data.csv', encoding='utf-8')
feature_cols = ['age', 'gender', 'sbp', 'dbp', 'blood_glucose',
'total_cholesterol', 'bmi', 'smoking', 'drinking', 'exercise_freq']
data = df[feature_cols].copy()
# 2. 缺失值处理:中位数填充 + 众数填充(按字段类型)
num_cols = data.select_dtypes(include=['float64', 'int64']).columns
cat_cols = data.select_dtypes(include=['object']).columns
for col in num_cols:
data[col] = data[col].fillna(data[col].median())
for col in cat_cols:
data[col] = data[col].fillna(data[col].mode()[0])
# 3. 异常值处理(以收缩压为例,采用IQR方法)
Q1, Q3 = data['sbp'].quantile(0.25), data['sbp'].quantile(0.75)
IQR = Q3 - Q1
lower, upper = Q1 - 1.5 * IQR, Q3 + 1.5 * IQR
# 对超出合理临床范围的值做截断处理,而不是直接删除
data.loc[data['sbp'] < lower, 'sbp'] = lower
data.loc[data['sbp'] > upper, 'sbp'] = upper
# 4. 标准化
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
# 5. 选择K个簇 + k-means++初始化 + 固定随机种子
kmeans = KMeans(n_clusters=4, init='k-means++', random_state=42, n_init=10)
labels = kmeans.fit_predict(scaled_data)
# 6. 计算三项评估指标
sil = silhouette_score(scaled_data, labels)
dbi = davies_bouldin_score(scaled_data, labels)
chi = calinski_harabasz_score(scaled_data, labels)
print(f"轮廓系数: {sil:.4f}, Davies-Bouldin: {dbi:.4f}, Calinski-Harabasz: {chi:.4f}")
# 7. 聚类标签回挂原始数据框
df['cluster_label'] = labels
df.groupby('cluster_label')[feature_cols].mean().to_csv('cluster_profile.csv')
# 8. PCA降维到2D,用于前端散点图展示
pca = PCA(n_components=2)
pca_result = pca.fit_transform(scaled_data)
df['pc1'] = pca_result[:, 0]
df['pc2'] = pca_result[:, 1]
df.to_csv('cluster_visualization_data.csv', index=False)
有几个细节要提醒你。
n_init=10这个参数,很多人默认就忽略了。sklearn在KMeans中会独立运行n_init次,取其中SSE最小的结果作为最终模型。默认值是10,建议不要改小,否则稳定性会打折扣。
对groupby('cluster_label').mean()输出的簇中心特征表,这是后续分析的核心产出。一定要把它整理成直观的表格或图表放进系统,而不是只输出一串原始数字。答辩时评委问“你的分析结果是什么”,你直接把这张表亮出来,说服力远强于一堆术语。
最后,PCA降维图只是辅助呈现手段,不是算法的一部分。一定要在论文里注明“使用PCA将聚类结果映射到二维平面,用于可视化展示,聚类本身在原始特征空间完成”,否则会有严谨的评委质疑你“是不是在2D坐标上做的聚类”。
4.3 前端可视化:如何呈现聚类结果才有“分析系统”的质感
可视化这一步是“分析系统”的门面,也是拉开工作量差距的关键。很多人的系统做到最后就是一张散点图加一张表格,看起来非常单薄。我建议至少包含以下四个视图:
健康分群总览: 以饼图或柱状图展示各簇的人数占比,点击不同簇可以联动展示该簇的具体信息。
特征雷达图: 把每簇在标准化后的各特征均值画在同一张雷达图上,可以直观对比“重度风险组的胆固醇和血糖指标确实显著高于轻度组”这类判断。这张图几乎是集群特征解释的标准答案,也是论文里最值得展示的图之一。
2D散点分布图: 使用PCA降维结果绘制,不同颜色表示不同簇。鼠标悬停时可以查看该样本的基本信息。实测下来,ECharts的scatter系列配上dataZoom组件就能实现很好的交互效果。
个人健康档案查询与预测: 输入一个人的生理指标,系统通过距离计算判断离哪个质心最近,返回所属风险组。这一步让系统从“只看人群”升级到“能用于个体初步评估”,是答辩加分项。
我在自己的项目里还加过一个“就医建议规则引擎”:根据每个簇的平均血压值范围、合并指标异常数量,在规则表里匹配对应的体检复查建议(比如“建议三个月内复查动态血压”“建议转诊内分泌科排查糖尿病”)。这部分不涉及任何算法复杂度,完全是if-else规则映射,但做完之后整个系统的业务价值立刻就不一样了。
4.4 安全与脱敏:医疗系统躲不开的合规底线
医疗健康数据的隐私合规问题在答辩时经常被问到。即便你的数据是公开数据集或模拟数据,系统设计上也应该展示出“我懂医疗数据底线”的态度。
我的建议是三件事,代码量不大但效果很好:
- 前端页面统一做数据脱敏显示: 用户编号、姓名、身份证号等标识字段一律用星号遮蔽或干脆不展示。
- 接口层加简单的鉴权逻辑: 用Flask自带的
session或者JWT,加一个小型登录注册功能,用户必须登录才能访问系统。 - 论文里单列一节“数据伦理与隐私保护”, 说明数据来源合规性、脱敏处理策略以及存储安全措施。这个点在毕设评分里分量非常重,比你多跑一个模型还管用。
5. 毕设避坑指南:我见过太多人在这几个地方卡住
5.1 坑一:安装了sklearn但导入KMeans报错
很多人卡在环境配置上,from sklearn.cluster import KMeans执行时报错,原因大多是scikit-learn和numpy/scipy版本不兼容。建议使用pip install scikit-learn pandas matplotlib scipy时加上版本约束,或者直接创建一个干净的conda环境:
bash复制conda create -n health_analysis python=3.9
conda activate health_analysis
pip install numpy==1.23.5 pandas==1.5.3 scikit-learn==1.2.2 matplotlib==3.6.3
这套组合我实测是稳定的,Python 3.9 + 上述版本组合不会出现import层面的幺蛾子。如果用了新版Python(比如3.11、3.12),遇到问题的概率会高一些,毕设阶段没必要折腾兼容性,老实锁定版本反而省时间。
5.2 坑二:聚类结果“哑火”——每个簇之间没有任何区分度
这种情况比你想象的常见。跑完聚类后一检查,四个簇的均值在各项指标上几乎一样,完全分不出差异。原因大概率不是算法问题,而是数据处理问题:
- 特征选择太弱,混入了大量与高血压无关的字段(比如血型、学历),噪声淹没了信号;
- 数据本身是从随机分布生成的,根本没有内在聚簇结构。k-means在这种情况下会硬切出K个簇,但每个簇都是“随机切片”;
- 样本量太少(几十条),跑聚类没有统计意义。
解决办法是先用简单统计看一下数据分布。如果数据的标准差非常小,或者字段间相关性几乎为0,就不要急着上聚类。我自己测试过,生成模拟数据时只要把收缩压、舒张压、BMI三个字段设定为强相关,聚类出来就会有清晰的分层感。
5.3 坑三:答辩演示时系统突然报错
这个问题完全是排练不够造成的。实际上总结下来就三类应变措辞:
- 如果算法接口报错,就说“当前演示环境缺少XX依赖,系统在完整部署环境中已通过稳定性测试”——前提是你真的在完整环境里跑通过,不能凭空撒谎。
- 如果前端图表加载慢,准备好一套“这是实时计算导致,数据量大时响应时间会有所上升,正式部署时已预留缓存优化方案”的说辞。
- 如果评委点开的页面恰好是空白,直接引导到其他已完成的功能模块,不要在一个页面上死磕。
5.4 坑四:论文里的算法原理部分照抄教材
毕设论文最容易被看出水的地方,就是原理部分。你想想,评委看了成百上千篇论文,如果k-means的原理介绍还停留在“随机选取K个中心点,计算距离,迭代直到收敛”的教材段落,等同于告诉对方“我没理解这个算法”。
我的建议是原理部分至少写到以下层次:优化目标函数的推导(最小化簇内平方和)、k-means++初始化机制与随机初始化对比的动机(为什么初始点选不好会陷入较差的局部最优)、KKT条件视角下的收敛性解释(如果学过最优化的话),以及算法局限性与适用边界(对噪声敏感、对初始值敏感、只能发现凸簇)。这些层次不需要写得多高深,但每一层都表明你是站在“会用且理解”的位置,而不是“看过教材”的位置。
6. 进阶扩展方向:让这个毕设从“合格”变“优秀”的三个突破口
6.1 用轮廓系数找出最佳的K值,但别只用一个指标做决定
前面提过的肘部法则和轮廓系数,这里我再补充一个实际经验:如果你画出的轮廓系数随K变化的曲线在多个K值处都比较接近,优先选择业务解释更通畅的那一个,而不是数学上最优的那一个。我在一次实际项目中,轮廓系数在K=4时略高于K=3,但K=3的三类人群特征图在雷达图上差异极其清晰,K=4时多出来的那个簇和其他簇存在大量特征重叠。最终选择了K=3,医生也能准确区分三类人群的干预方案。
6.2 引入PCA降维辅助可视化,但务必注意信息损失
这个方向前面已经提到过,这里补充一个实操细节:默认的PCA(n_components=2)会直接压缩到两个主成分,但这两个主成分的累计方差贡献率可能只有50%左右,说明降维后的图并不能完整还原原始分布。更好的做法是先保留三个主成分,使用三维散点图展示,或者提供“主成分累计方差解释度”曲线图,让用户明确知道2D图展示了多少信息。这个小细节会让你的系统看起来非常专业。
6.3 后期扩展:从k-means到集成聚类与健康干预知识图谱
如果时间充裕,可以增加一个延伸模块:在k-means分群的基础上,对每个簇训练一个简单的决策树分类器,用树模型的特征重要性来反向验证k-means分群的关键特征。或者再深一点,把膳食结构、用药依从性、既往病史等信息引入,用聚类结果构建一个“高血压风险-干预方案知识图谱”的原型。这个方向在当前健康大数据领域非常热门,论文里提一句“后续将从静态聚类升级为动态更新聚类,并结合知识图谱做干预推荐”,评委对选题前瞻性这一项的评分会明显提高。
7. 从代码到毕业设计论文:查漏补缺与时间规划
到最后阶段,很多人的系统已经写在本地了,但论文还一个字没动。我个人建议的时间分配是这样的:系统开发占总时间的40%,论文撰写占30%,测试和答辩准备占30%。如果你已经把算法跑通,接下来最要紧的是把以下内容沉淀到论文里:
- 数据来源说明和数据集构建过程;
- 数据清洗与预处理的前后对比表;
- 聚类数K的选取过程和评估指标对比表;
- 各聚类群组的特征画像分析;
- 系统功能模块截图和关键代码片段;
- 测试报告和答辩演示脚本。
我见过不少系统做得很完整、但论文写得像流水账的学生,最后分数反而不如系统一般但论文结构清晰的同学。这不是不公平,而是论文本身就是毕业设计考察的核心交付物。建议用“问题定义-数据方案-算法设计-系统实现-结果分析-总结展望”这条主线,把每一个模块的“为什么这么做”写透,比贴十页代码有意义得多。
最后分享一个我个人工作里的习惯——健康分析类项目做完之后,别急着删数据。把聚类效果截图和各簇的画像描述保存好,无论是后续求职时的项目复盘,还是想扩展成学术论文,都是非常好的素材积累。医疗大数据这个方向这几年发展很快,有真实业务理解的分析师和工程师始终是稀缺的,一份认真做过、能讲清楚前因后果的毕设项目,会在面试中发挥出超乎你预期的价值。
