私はscikit-learnを使っていて、映画に興味を持っている人をクラスタ化しようとしています。私は異なる列(各映画に1つ)と行を持つ疎な行列を作成します。ユーザーが映画を好きだった場合、指定されたセルについては0または1になります。scikit-learnのDBSCANアルゴリズムの入力行列とパラメータ
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から例DBSCANを使用してこれをしました。私は2つの質問がある、最初の1つは: "私の行列は、このアルゴリズムに適したフォーマットと適切ですか?"次元の数を考えると、私はこの懸念を持っています。 2番目の質問は「どのようにイプシロンパラメータを設定するか(私のポイント間の最小距離)ですか?」です。
ありがとうございます。しかし、私のアルゴリズムをそのまま実行すると。私は少しコヒーレントな結果を得るか、またまあまあの行列を使用せず、コサインの距離ではないという結果が、私の結果を完全に役に立たなくするでしょうか? – mel
おそらくうまくいくかもしれません。 「StandardScaler」は、連続した高密度データのためのものでもあります。それはクラッシュしません。しかし、コサインベースのアプローチでは、おそらくより良い結果が得られます。そしてあなたはまだイプシロンを知らないので、もっと何かをしなければならないでしょう... –