首页 > 解决方案 > 用于光谱聚类的 Python 输入

问题描述

我正在使用 https://github.com/pin3da/spectral-clustering/blob/master/spectral/utils.py 中的代码对https://cs.joensuu.fi/sipu/datasets/s1中的数据进行光谱聚类。文本

我可以知道如何更改代码以使其可以将 txt 文件作为输入吗?我在下面给出了原始代码以供参考

来自 GitHub 的原始代码

 import numpy
 import scipy.io
 import h5py


def load_dot_mat(path, db_name):
     try:
        mat = scipy.io.loadmat(path)
     except NotImplementedError:
          mat = h5py.File(path)

    return numpy.array(mat[db_name]).transpose()

我不明白变量db_name的用途

标签: pythonio

解决方案


您在此处显示的代码只是打开一个给定的math5文件。文件的路径 ( path) 和文件中的数据集的名称 ( db_name) 作为函数的参数提供load_dot_mat

要加载您的 txt 文件,我们可以创建自己的小加载函数:

def load_txt(filename):
    with open(filename, "r") as f:
        data = [[int(x) for x in line.split(" ") if x != ""] for line in f]
    return np.array(data)

此函数将“txt”文件的路径作为参数,并返回一个包含文件数据的 numpy 数组。数据数组具有您提供的文件的形状 (5000,2)。如果其他文件包含浮点值而不仅仅是整数,您可能想要使用float而不是。int

然后,您的数据的完整聚类步骤可能如下所示:

from itertools import cycle, islice
import matplotlib.pyplot as plt
import numpy as np
import seaborn
from spectral import  affinity, clustering

seaborn.set()


def load_txt(filename):
    with open(filename, "r") as f:
        data = [[int(x) for x in line.split(" ") if x != ""] for line in f]
    return np.array(data)


data = load_txt("s1.txt")

A = affinity.com_aff_local_scaling(data)
n_cls = 15  # found by looking at your data
Y = clustering.spectral_clustering(A, n_cls)
colors = np.array(list(islice(cycle(seaborn.color_palette()), int(max(Y) + 1))))
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.scatter(data[:, 0], data[:, 1], color=colors[Y], s=6, alpha=0.6)
plt.show()

在此处输入图像描述


推荐阅读