来自scikit-learn

时间:2016-04-19 10:00:59

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

我很擅长使用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

我认为这就像一个向量数组,从doc开始,这是一个可接受的输入。

  

从矢量数组或距离矩阵执行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参数(我的点之间的最小距离)?"

1 个答案:

答案 0 :(得分:1)

请参阅DBSCAN文章,了解如何根据k距离图选择epsilon。

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

 sparse_matrix = numpy.zeros(...)

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