如何将3D自定义MIDI数据输入sklearn PCA函数实现指定格式维度降维
问题原因
你的输入数据是三维数组(形状为[MIDI文件数, 序列长度, 特征数],对应你的场景就是[2,10,2]),但sklearn的PCA仅接受二维数组输入(要求形状为[样本数, 特征数]),因此触发维度不匹配报错。同时你原来的参数设置也存在问题:n_components是降维后每个样本的特征维度,你需要把2个特征(节奏、旋律)降为1个,因此该参数应该设为1,而非序列长度10。
解决方法
你可以先把三维数组展平为符合PCA要求的二维结构,降维完成后再恢复为你需要的目标格式,具体逻辑如下:
- 将三维输入
(MIDI文件数, 10, 2)reshape为(MIDI文件数*10, 2),此时每一行对应一个[节奏, 旋律]特征对,符合PCA输入要求 - 用PCA将每个二维特征对降为1维数值
- 将降维后的结果reshape回
(MIDI文件数, 10),就是你需要的目标格式
调整后代码
import numpy as np from sklearn.decomposition import PCA def PCA_preprocessing(data, n_components=1): # 先记录原始数据的形状 file_count, seq_len, feature_num = data.shape # 展平为二维:总样本数=文件数*序列长度,特征数保持2 reshape_data = data.reshape(-1, feature_num) # PCA降维 pca = PCA(n_components=n_components) pca.fit(reshape_data) PCA_data = pca.transform(reshape_data) # 恢复为 文件数*序列长度 的目标结构 PCA_data = PCA_data.reshape(file_count, seq_len) return PCA_data # 调用示例,假设你的data是numpy数组 PCA_data = PCA_preprocessing(data, n_components=1)
补充说明
如果你需要对每个MIDI文件单独拟合PCA而非全局统一拟合,可以按文件遍历处理即可,代码调整为:
def PCA_preprocessing_per_file(data, n_components=1): file_count, seq_len, feature_num = data.shape PCA_data = np.zeros((file_count, seq_len)) for i in range(file_count): single_file_data = data[i] # 形状为(10,2) pca = PCA(n_components=n_components) PCA_data[i] = pca.fit_transform(single_file_data).flatten() return PCA_data
内容的提问来源于stack exchange,提问作者Seungyeon Baek
相关产品推荐
相关产品推荐

