给出一个k均值无监督聚类模型的实现要求输入数据是一个txt文件其中该txt文件内包含869个csv文件名每一行只有一个csv名字csv文件保存在当前目录下的Abnormal目录中每个csv文件只有一列数据每列数据有361行从第二行开始到第361行是需要处理的数据为心电信号数据格式是浮点数类型要求代码给出聚类结果聚类数量不做限制给出可视化结果并保存在本地可视化图需要好看聚类结束后将每个csv文件的聚
由于需要读取多个csv文件进行聚类,我选择Python作为实现语言,使用scikit-learn库中的KMeans算法进行聚类,使用matplotlib库进行可视化,并使用pandas库读取和写入csv文件。
首先,读取txt文件中的csv文件名,并将每个csv文件中的数据读入到一个大的列表中:
import os
import pandas as pd
file_list = []
with open('file_names.txt', 'r') as f:
for line in f:
file_list.append(line.strip())
data = []
for file_name in file_list:
file_path = os.path.join('Abnormal', file_name)
df = pd.read_csv(file_path, header=None, skiprows=1)
data.append(df.values.flatten())
然后,使用KMeans算法进行聚类:
from sklearn.cluster import KMeans
k = 5 # 聚类数量
kmeans = KMeans(n_clusters=k)
kmeans.fit(data)
labels = kmeans.labels_
接下来,使用matplotlib库对聚类结果进行可视化,并将可视化结果保存到本地:
import matplotlib.pyplot as plt
colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k']
for i in range(k):
plt.scatter(data[labels == i, 0], data[labels == i, 1], s=10, c=colors[i % len(colors)], label='Cluster %d' % i)
plt.legend()
plt.savefig('cluster_result.png')
plt.show()
最后,将每个csv文件的聚类结果保存到本地:
for i, file_name in enumerate(file_list):
df = pd.read_csv(os.path.join('Abnormal', file_name), header=None, skiprows=1)
df['label'] = labels[i]
df.to_csv(os.path.join('Clustered', file_name), index=False, header=False)
完整代码如下:
import os
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
file_list = []
with open('file_names.txt', 'r') as f:
for line in f:
file_list.append(line.strip())
data = []
for file_name in file_list:
file_path = os.path.join('Abnormal', file_name)
df = pd.read_csv(file_path, header=None, skiprows=1)
data.append(df.values.flatten())
k = 5 # 聚类数量
kmeans = KMeans(n_clusters=k)
kmeans.fit(data)
labels = kmeans.labels_
colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k']
for i in range(k):
plt.scatter(data[labels == i, 0], data[labels == i, 1], s=10, c=colors[i % len(colors)], label='Cluster %d' % i)
plt.legend()
plt.savefig('cluster_result.png')
plt.show()
for i, file_name in enumerate(file_list):
df = pd.read_csv(os.path.join('Abnormal', file_name), header=None, skiprows=1)
df['label'] = labels[i]
df.to_csv(os.path.join('Clustered', file_name), index=False, header=False)
``
原文地址: http://www.cveoy.top/t/topic/cd3i 著作权归作者所有。请勿转载和采集!