基于Python的DBSCAN识别相似评分与类型偏好用户的工作流是否正确?
问题分析与解答
核心问题:单用户数据下的DBSCAN工作流合理性
你当前的工作流存在本质逻辑错误——DBSCAN是用来对**多个样本(这里指多个用户)**进行聚类的算法,而你只有1个用户的数据,根本没有可聚类的样本群体,自然无法识别“相似偏好用户”。
具体问题拆解
数据维度错误
你的数据结构是Title | User Score | Genre,这是单用户的评分记录,而用户偏好聚类需要的是多用户维度的数据:每个样本是一个用户,特征是该用户对不同类型的偏好(比如各类型的平均评分、观看占比等),或者用户的评分向量。编码与特征处理的偏差
你对Genre做独热编码后按Title和Score分组求和,得到的是每部作品的类型标记+评分,这本质还是单用户的作品维度数据,不是用户维度的特征,无法用来做用户聚类。图表形态的原因
你生成的类水平图表,本质是因为只有1个用户的样本(或者说你误把作品当用户样本),DBSCAN无法形成有效聚类,所有点的标签要么是-1(噪声)要么是同一个簇,所以呈现水平分布。而常见的环形DBSCAN图表,是多样本、多簇的聚类结果,和你的数据场景完全不同。
正确的方向调整
如果要做用户偏好聚类,你需要:
- 收集多个用户的评分数据,每个用户对应一条样本
- 构建用户级特征:比如统计每个用户在不同Genre下的平均评分、评分数量、偏好权重等
- 再用DBSCAN(或K-Means等聚类算法)对用户样本进行聚类
如果只有单用户数据,你可以做的是该用户的作品聚类:比如把该用户评分的作品按类型+评分聚类,找出用户偏好的作品组,而不是用户聚类。
修正后的示例(单用户作品聚类)
import pandas as pd from sklearn.cluster import DBSCAN from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA import matplotlib.pyplot as plt # 假设单用户数据:Title | User Score | Genre anime_dataframe = pd.DataFrame([ {"Title": "A", "Score": 9, "Genre": "Action"}, {"Title": "B", "Score": 8, "Genre": "Action"}, {"Title": "C", "Score": 5, "Genre": "Romance"}, {"Title": "D", "Score": 6, "Genre": "Romance"}, {"Title": "E", "Score": 10, "Genre": "Sci-Fi"} ]) # 独热编码Genre,保留Score作为特征 anime_encoded = pd.get_dummies(anime_dataframe, columns=['Genre'], prefix='Genres') features = anime_encoded.drop('Title', axis=1) # 标准化+PCA降维 scaler = StandardScaler() scaled_features = scaler.fit_transform(features) pca = PCA(n_components=2) # 用2维方便可视化 reduced_features = pca.fit_transform(scaled_features) # DBSCAN聚类作品 dbscan = DBSCAN(eps=0.6, min_samples=2) labels = dbscan.fit_predict(reduced_features) # 可视化作品聚类结果 plt.figure(figsize=(8, 6)) plt.scatter(reduced_features[:, 0], reduced_features[:, 1], c=labels, cmap='viridis', s=50) for i, title in enumerate(anime_dataframe['Title']): plt.annotate(title, (reduced_features[i, 0], reduced_features[i, 1])) plt.title('单用户作品聚类结果(按类型+评分)') plt.xlabel('主成分1') plt.ylabel('主成分2') plt.show()
内容的提问来源于stack exchange,提问作者DarthKibo
相关产品推荐
相关产品推荐

