无监督聚类:使用K均值算法对心电信号进行分类
本教程展示如何使用 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]}
')
原文地址: https://www.cveoy.top/t/topic/nrmP 著作权归作者所有。请勿转载和采集!