如何将K-Means聚类标签与原始数据的Cookie ID、会话ID关联导出
解决K-Means聚类标签与用户ID关联的问题
看起来你已经完成了聚类的核心部分,差的就是最后一步把聚类标签和原始的cookie_id、ses_num对应起来。问题出在你把各列数据拆分存储后,丢失了行与行之间的对应关系——其实只要在读取数据时保留完整的行记录,就能轻松把聚类标签匹配回去。
下面是修改后的完整代码,我会一步步解释关键改动:
import csv import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 1. 读取数据时同时保存完整行和聚类特征 rows = [] # 存储每一行的原始数据(cookie_id、ses_num等) features = [] # 存储用于聚类的num_material和num_jump with open('num_jumps_materials_in_network.csv', "r") as file: reader = csv.reader(file, delimiter='|', quotechar='"') header = next(reader) # 保存原始表头 for row in reader: rows.append(row) # 提取聚类用的特征并转成整数 num_mat = int(row[2]) num_jump = int(row[3]) features.append([num_mat, num_jump]) # 2. 转换特征数组并执行K-Means聚类 X = np.array(features) kmeans = KMeans(n_clusters=6) kmeans.fit(X) y_kmeans = kmeans.predict(X) # 3. 将聚类标签与原始行数据关联 # 构造输出表头(添加cluster列) output_header = header + ['cluster'] output_rows = [] # 按顺序把每个聚类标签添加到对应行的末尾 for row, cluster_label in zip(rows, y_kmeans): output_row = row + [str(cluster_label)] output_rows.append(output_row) # 4. 输出结果(控制台打印 + 写入文件) # 控制台打印你需要的格式 print('|'.join(output_header)) for row in output_rows: print('|'.join(row)) # 写入到新的CSV文件方便后续分析 with open('clustered_network_data.csv', 'w', newline='') as outfile: writer = csv.writer(outfile, delimiter='|') writer.writerow(output_header) writer.writerows(output_rows) # 保留你原来的可视化代码(可选) fig, (ax1, ax2) = plt.subplots(2, figsize=(15,15)) fig.suptitle('Clustering users by k-means (k=6)') ax1.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=30, cmap='gist_rainbow') ax2.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=30, cmap='gist_rainbow') ax2.set_xlim([0, 500]) ax2.set_ylim([0, 500]) plt.savefig('k_means_clusters_demo.png')
关键改动说明:
- 保留完整行记录:用
rows列表存储每一行的原始数据,确保后续聚类标签和原始数据的索引完全对应(因为features和rows是按读取顺序一一存储的)。 - 关联聚类标签:通过
zip(rows, y_kmeans)把每一行数据和对应的聚类标签配对,直接添加到行末尾。 - 输出格式匹配:最终输出的表头和行数据都用
|分隔,完全符合你需要的格式。
运行这段代码后,你会在控制台看到类似这样的输出:
cookie_id|ses_num|num_material|num_jump|cluster 2345|1|2|1|0 2345|2|8|12|2 3456|1|3|2|1
同时会生成一个包含聚类结果的CSV文件clustered_network_data.csv,方便后续分析使用。
内容的提问来源于stack exchange,提问作者aysess
相关产品推荐
相关产品推荐

