PCA(主成分分析压缩特征)

首先我们先读取数据。

df = pd.read_csv('../B005放电数据集.csv')

数据显示如下:

 这是一个50285*9大小的数据矩阵,我们想要的是以一个Cycle所对应的所有的除去SOH外的所有特征进行行压缩变成一个值。例如当Cycle为1时,对应的Voltage_measured有一百多个,而我想要一个,以便于达到属性之间的一一对应。(在这里我想要避一个雷。虽然我最终实现了特征压缩,但是我把一个50285*9大小的数据矩阵压缩到了168*9大小,但是结果表明,压缩可能过于激烈了,把一些数据间的分布规律给压缩掉了,后面直接使用50285*9大小矩阵进行学习,结果大幅度优化),在这里我只介绍我理解的PCA的用法。

df = df.iloc[:, 1:-1] # 去掉数据集的第一列和最后一列

# 将cycle列数值类型转化
df['Cycle'] = pd.to_numeric(df['Cycle'], errors='coerce').astype('Int64')

 在这里出去第1、2、9列外都不是一一对应的,因此我们需要使用PCA进行行压缩。因此要剔除第一列以及第九列。我们使用第二列Cycle进行分组,因为PCA方法时特征提取的方法,适合列压缩,如果我们要用行压缩并一一对应,必须要将原来的数据按分组的形式转置,把每一个数据都看成一个特征,在使用PCA即可。因此我们必须使用Cycle分组进行转置,在使用PCA。

这边为了使转置后按Cycle顺序排列,必须把Cycle数值化。

df['Cycle'] = pd.to_numeric(df['Cycle'], errors='coerce').astype('Int64')

这里向大家展示分组并转置的代码和结果:

for _, group in df.groupby('Cycle',): #这里gropby()是分组方法,参数为列名
    group_t = group.set_index('Cycle').T # .T为矩阵转置
    print(group_t)                         # ‘——’为占位符可以为任意字符,因为后续用不到

结果如下:

 之后对每一个分组使用PCA即可。

代码如下:

pca = PCA(n_components=1)
pca.fit(group_t)
group_pca = pca.transform(group_t).flatten()
results.append(pd.Series(group_pca))

相关解释如下:

  • pca(n_components=1):创建一个pca对象,其中n_components参数设置为值1,这表示将输入数据减少到一维。
  • pca.fit(group_t):把 group_t 中的数据用于训练 pca 模型,训练出数据中的主成分。
  • pca.transform(group_t).flatten():transform 函数对数据应用由 fit 得到的转换,将group_t(一般是二维数组)投影到主成分轴上,使用 flatten 把所有元素放在同一个维度上
  • results.append(pd.series(group_pca)):将得到的一维数据作为 series 对象附加到 results 列表尾部。

 其中group_pca的输出如下:

现在我们只需要将其输出到CSV文件就大功告成了。 

results = pd.DataFrame(results)
results.to_csv('./B0005_特征数据集.csv')

DataFram()将python中的数据转换成 pandas 数据框的格式,使之易于后续直接转换为CSV文件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值