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