本教程展示如何使用 Python 和 KMeans 算法对心电信号进行无监督分类。

首先,我们需要读取包含 869 个 CSV 文件名的文本文件 'abnormal_list.txt',每个文件名对应一个心电信号数据文件,并将它们转化为数据集。每个 CSV 文件都存储在 'Abnormal' 文件夹下,包含一列 361 行数据,代表心电信号。

import numpy as np
import pandas as pd

# 读取txt文件中的csv文件名
with open('abnormal_list.txt', 'r') as f:
    csv_names = f.readlines()

csv_names = [x.strip() for x in csv_names]  # 去除文件名中的换行符

# 将csv文件转化为数据集
data = np.zeros((len(csv_names), 361))
for i, name in enumerate(csv_names):
    df = pd.read_csv('Abnormal/' + name + '.csv', header=None)
    data[i] = df.values.flatten()

接下来,我们可以使用 sklearn 库中的 KMeans 模型进行聚类,将数据分成 5 类。

from sklearn.cluster import KMeans

# 训练KMeans模型
kmeans = KMeans(n_clusters=5)
kmeans.fit(data)

# 获取聚类结果
labels = kmeans.labels_

然后,我们可以使用 matplotlib 库进行可视化,将每个类别用不同的形状标记,并保存可视化结果到本地。

import matplotlib.pyplot as plt

# 可视化聚类结果
fig, ax = plt.subplots()
colors = ['red', 'green', 'blue', 'yellow', 'purple']  # 每个类别对应的颜色
markers = ['o', 's', 'D', '^', 'v']  # 每个类别对应的形状
for i in range(5):
    ax.scatter(data[labels == i, 0], data[labels == i, 1], c=colors[i], marker=markers[i], label=f'Cluster {i+1}')
ax.legend()
plt.savefig('cluster_result.png')

最后,我们需要将每个 CSV 文件的类别结果存储在本地,以便后续分析。

# 将每个csv文件的类别结果存储在本地
with open('cluster_result.txt', 'w') as f:
    for i, name in enumerate(csv_names):
        f.write(f'{name},{labels[i]}
')

完整代码如下:

import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 读取txt文件中的csv文件名
with open('abnormal_list.txt', 'r') as f:
    csv_names = f.readlines()

csv_names = [x.strip() for x in csv_names]  # 去除文件名中的换行符

# 将csv文件转化为数据集
data = np.zeros((len(csv_names), 361))
for i, name in enumerate(csv_names):
    df = pd.read_csv('Abnormal/' + name + '.csv', header=None)
    data[i] = df.values.flatten()

# 训练KMeans模型
kmeans = KMeans(n_clusters=5)
kmeans.fit(data)

# 获取聚类结果
labels = kmeans.labels_

# 可视化聚类结果
fig, ax = plt.subplots()
colors = ['red', 'green', 'blue', 'yellow', 'purple']  # 每个类别对应的颜色
markers = ['o', 's', 'D', '^', 'v']  # 每个类别对应的形状
for i in range(5):
    ax.scatter(data[labels == i, 0], data[labels == i, 1], c=colors[i], marker=markers[i], label=f'Cluster {i+1}')
ax.legend()
plt.savefig('cluster_result.png')

# 将每个csv文件的类别结果存储在本地
with open('cluster_result.txt', 'w') as f:
    for i, name in enumerate(csv_names):
        f.write(f'{name},{labels[i]}
')
无监督聚类:使用K均值算法对心电信号进行分类

原文地址: https://www.cveoy.top/t/topic/nrmP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录