【问题标题】:Input matrix and parameters for the DBSCAN algorithm from scikit-learn来自 scikit-learn 的 DBSCAN 算法的输入矩阵和参数
【发布时间】:2016-08-11 10:27:19
【问题描述】:

我是使用 scikit-learn 的新手,我正在尝试根据人们对电影的兴趣对他们进行聚类。我创建了一个稀疏矩阵,它有不同的列(每部电影一个)和行。对于给定的单元格,如果用户喜欢这部电影,则为 0 或 1。

sparse_matrix = numpy.zeros(shape=(len(list_user), len(list_movie)))
for id in list_user:
    index_id = list_user.index(id)
    for movie in list_movie[index_id]:
        if movie.isdigit():
            index_movie = list_movie.index(int(movie))
            sparse_matrix[index_id][index_movie] = 1
pickle.dump(sparse_matrix, open("data/sparse_matrix", "w+"))
return sparse_matrix

我认为这就像一个向量数组,从文档来看这是一个可接受的输入。

从向量数组或距离矩阵执行 DBSCAN 聚类。

Link to the citation

所以我尝试做一些事情来使用 scikit-learn:

sparse_matrix = pickle.load(open("data/sparse_matrix"))
X = StandardScaler().fit_transform(sparse_matrix)
db = DBSCAN(eps=1, min_samples=20).fit(X)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_
print labels

我使用来自 scikit-learn 的示例 DBSCAN 进行了此操作。我有两个问题,第一个是:“我的矩阵格式是否正确并适合这种算法?”当我考虑维度的数量时,我有这个问题。第二个问题是“我如何设置 epsilon 参数(我的点之间的最小距离)?”

【问题讨论】:

    标签: python scikit-learn cluster-analysis sparse-matrix dbscan


    【解决方案1】:

    有关如何根据 k 距离图选择 epsilon 的建议,请参阅 DBSCAN 文章。

    由于您的数据稀疏,因此可能更适合使用例如余弦距离而不是欧几里得距离。您还应该使用 sparse 格式。据我所知,numpy.zeros 将创建一个 dense 矩阵:

     sparse_matrix = numpy.zeros(...)
    

    因此具有误导性,因为它是一个密集矩阵,只有大部分为 0。

    【讨论】:

    • 感谢您的回复。但是如果我按原样运行我的算法。我会得到一个有点连贯的结果,还是我不使用稀疏矩阵而不是余弦距离的事实会使我的结果完全没用?
    • 或许有效,或许无效。 StandardScaler 也适用于连续密集数据。它不会崩溃。但是使用基于余弦的方法可能会获得更好的结果。而且你还不知道 epsilon,所以你必须做更多的事情......
    猜你喜欢
    • 2014-09-11
    • 2013-04-12
    • 2013-07-01
    • 2016-05-12
    • 2018-09-25
    • 2016-06-25
    • 1970-01-01
    • 2015-08-04
    • 2018-05-22
    相关资源
    最近更新 更多