基于K均值算法的心电信号无监督分类模型实现

本模型实现了一个基于K均值算法的心电信号无监督分类模型,能够将869个心电信号数据进行聚类,并生成可视化结果,最终将每个信号数据所属类别存储到本地。

1. 数据预处理

首先需要将所有csv文件读入内存,并将数据转换为numpy数组,以便后续处理。

import numpy as np
import pandas as pd

# 读入所有csv文件并保存到字典中
data_dict = {}
with open('abnormal_list.txt', 'r') as f:
    for line in f:
        filename = line.strip()
        data = pd.read_csv('Abnormal/' + filename, header=None).values.flatten()
        data_dict[filename] = data

# 合并所有数据为一个大矩阵
X = np.vstack(list(data_dict.values()))

2. 模型训练

使用sklearn库中的KMeans模型进行训练,聚类数量为5。

from sklearn.cluster import KMeans

# KMeans模型训练
kmeans = KMeans(n_clusters=5, random_state=42)
y_pred = kmeans.fit_predict(X)

3. 可视化结果

使用matplotlib库将聚类结果可视化,并保存到本地。

import matplotlib.pyplot as plt

# 可视化聚类结果
fig, ax = plt.subplots()
for i in range(5):
    mask = y_pred == i
    ax.scatter(X[mask, 0], X[mask, 1], label=f'Cluster {i+1}')
ax.legend()
plt.savefig('cluster_result.png')
plt.show()

4. 存储每个csv文件的类别结果

将聚类结果按照每个csv文件的顺序进行存储。

# 存储每个csv文件的类别结果
with open('result.txt', 'w') as f:
    for filename, data in data_dict.items():
        idx = int(np.where((X == data).all(axis=1))[0])
        cluster = y_pred[idx]
        f.write(f'{filename},{cluster}\n')

完整代码如下:

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

# 读入所有csv文件并保存到字典中
data_dict = {}
with open('abnormal_list.txt', 'r') as f:
    for line in f:
        filename = line.strip()
        data = pd.read_csv('Abnormal/' + filename, header=None).values.flatten()
        data_dict[filename] = data

# 合并所有数据为一个大矩阵
X = np.vstack(list(data_dict.values()))

# KMeans模型训练
kmeans = KMeans(n_clusters=5, random_state=42)
y_pred = kmeans.fit_predict(X)

# 可视化聚类结果
fig, ax = plt.subplots()
for i in range(5):
    mask = y_pred == i
    ax.scatter(X[mask, 0], X[mask, 1], label=f'Cluster {i+1}')
ax.legend()
plt.savefig('cluster_result.png')
plt.show()

# 存储每个csv文件的类别结果
with open('result.txt', 'w') as f:
    for filename, data in data_dict.items():
        idx = int(np.where((X == data).all(axis=1))[0])
        cluster = y_pred[idx]
        f.write(f'{filename},{cluster}\n')

注意:

由于本模型涉及到比较多的数据处理,代码较长,因此只能给出核心代码,具体实现请根据需要自行编写。

基于K均值算法的心电信号无监督分类模型实现

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

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