我很擅长使用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聚类。
所以我尝试做一些使用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参数(我的点之间的最小距离)?"
答案 0 :(得分:1)
请参阅DBSCAN文章,了解如何根据k距离图选择epsilon。
由于您的数据稀少,因此可能更适合使用,例如余弦距离而不是欧氏距离。您还应该使用稀疏格式。据我所知,numpy.zeros
将创建密集矩阵:
sparse_matrix = numpy.zeros(...)
因此具有误导性,因为它是一个密集的矩阵,只有大多数为0。