使用K均值算法对心电信号进行无监督分类

本文提供了一个Python实现的K均值聚类模型,用于对869个心电信号数据进行无监督分类,每个信号数据包含361个点,并将聚类结果可视化并保存到本地。

1. 导入必要的库和模块

import os
import csv
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

2. 定义数据加载函数

def load_data(file_path):
    '''
    从CSV文件中加载数据
    :param file_path: CSV文件路径
    :return: 二维数组,每行代表一个样本,每列代表一个特征
    '''
    data = []
    with open(file_path, 'r') as f:
        reader = csv.reader(f)
        for row in reader:
            data.append(float(row[0]))
    return np.array(data).reshape(-1, 1)

3. 加载数据集

data_dir = 'Abnormal'
file_list = os.listdir(data_dir)
X = np.zeros((len(file_list), 361))
for i, file_name in enumerate(file_list):
    file_path = os.path.join(data_dir, file_name)
    X[i] = load_data(file_path).T

4. 训练模型

kmeans = KMeans(n_clusters=5, random_state=0).fit(X)

5. 可视化聚类结果

colors = ['r', 'g', 'b', 'c', 'm']
markers = ['o', 's', 'D', '^', 'x']

fig, ax = plt.subplots()

for i in range(X.shape[0]):
    cluster_idx = kmeans.labels_[i]
    ax.scatter(i, X[i], c=colors[cluster_idx], marker=markers[cluster_idx])

ax.set_xlabel('Sample Index')
ax.set_ylabel('Heart Signal')
ax.set_title('K-Means Clustering')

plt.savefig('clustering_result.png')
plt.show()

6. 存储聚类结果

cluster_result = kmeans.labels_
with open('cluster_result.txt', 'w') as f:
    for i in cluster_result:
        f.write(str(i) + '\n')

完整代码如下:

import os
import csv
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

def load_data(file_path):
    '''
    从CSV文件中加载数据
    :param file_path: CSV文件路径
    :return: 二维数组,每行代表一个样本,每列代表一个特征
    '''
    data = []
    with open(file_path, 'r') as f:
        reader = csv.reader(f)
        for row in reader:
            data.append(float(row[0]))
    return np.array(data).reshape(-1, 1)

data_dir = 'Abnormal'
file_list = os.listdir(data_dir)
X = np.zeros((len(file_list), 361))
for i, file_name in enumerate(file_list):
    file_path = os.path.join(data_dir, file_name)
    X[i] = load_data(file_path).T

kmeans = KMeans(n_clusters=5, random_state=0).fit(X)

colors = ['r', 'g', 'b', 'c', 'm']
markers = ['o', 's', 'D', '^', 'x']

fig, ax = plt.subplots()

for i in range(X.shape[0]):
    cluster_idx = kmeans.labels_[i]
    ax.scatter(i, X[i], c=colors[cluster_idx], marker=markers[cluster_idx])

ax.set_xlabel('Sample Index')
ax.set_ylabel('Heart Signal')
ax.set_title('K-Means Clustering')

plt.savefig('clustering_result.png')
plt.show()

cluster_result = kmeans.labels_
with open('cluster_result.txt', 'w') as f:
    for i in cluster_result:
        f.write(str(i) + '\n')

聚类结果可视化图和聚类结果txt文件将分别保存在当前目录下的clustering_result.png和cluster_result.txt文件中。

使用K均值算法对心电信号进行无监督分类

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

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