基于6维向量的K-Means聚类输入格式问题及代码报错咨询
R-D曲线K-Means聚类:输入格式选择与代码修复
一、输入格式的选择
两种格式对应不同的聚类目标,按需选择:
- 2维输入(每个样本是(PSNR, 码率)对)
把每个码率档位对应的PSNR和码率值组成一个2维样本,比如(33.3987, 3929.76)。这种方式适合将R-D曲线上的单个点作为聚类对象,比如区分不同码率下的性能簇,或者找出异常的性能点。如果你的数据集包含多条R-D曲线,总样本数会是「曲线条数×档位数量」。 - 12维输入(每个样本是整条R-D曲线)
把6维PSNR向量和6维码率向量拼接成一个12维向量,作为单个样本。这种方式适合将整条R-D曲线的整体特征作为聚类对象,比如区分不同视频/编码方案的R-D曲线形态差异,仅当你有多条独立的R-D曲线时(比如代码里的71条),这种方式才有意义。
二、代码报错修复
你的代码报错是因为生成了3维数组(2,71,6),而K-Means要求输入必须是2维数组(样本数×特征数)。同时注意你变量名写反了(把码率数据加载到了psnr_bitrate,PSNR数据加载到了bitrate),先修正命名,再根据聚类目标调整输入:
场景1:以(PSNR,码率)对为样本(2维特征)
import numpy as np from sklearn.cluster import KMeans # 修正变量命名,加载数据 bitrate = np.load(r'F:/RD_data_from_twitch_system/RD_data_from_twitch_system/bitrate_1080.npy') psnr = np.load(r'F:/RD_data_from_twitch_system/RD_data_from_twitch_system/psnr_1080.npy') # 将每个档位的PSNR和码率配对,展平为N×2的2维数组 # reshape(-1,1)把71×6的数组转为426×1,再拼接成426×2 kmeans_input = np.hstack([psnr.reshape(-1, 1), bitrate.reshape(-1, 1)]) # 执行K-Means聚类 kmeans = KMeans(n_clusters=3) # 根据需求调整聚类数 clusters = kmeans.fit_predict(kmeans_input)
场景2:以整条R-D曲线为样本(12维特征)
import numpy as np from sklearn.cluster import KMeans # 修正变量命名,加载数据 bitrate = np.load(r'F:/RD_data_from_twitch_system/RD_data_from_twitch_system/bitrate_1080.npy') psnr = np.load(r'F:/RD_data_from_twitch_system/RD_data_from_twitch_system/psnr_1080.npy') # 拼接每条曲线的PSNR和码率向量,得到71×12的2维数组 kmeans_input = np.hstack([psnr, bitrate]) # 执行K-Means聚类 kmeans = KMeans(n_clusters=3) # 根据需求调整聚类数 clusters = kmeans.fit_predict(kmeans_input)
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

