2016-04-19 13 views
0

私は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クラスタリングを実行します。

Link to the citation

だから私は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番目の質問は「どのようにイプシロンパラメータを設定するか(私のポイント間の最小距離)ですか?」です。

答えて

1

k-距離グラフに基づいてイプシロンを選択する方法については、DBSCANの記事を参照してください。

データが希薄であるため、おそらく、ユークリッド距離よりもコサイン距離。 スパースの形式も使用する必要があります。私が知っているすべてについて、numpy.zeros行列作成します。

sparse_matrix = numpy.zeros(...) 

をそれだけでほとんど0で、密行列であるので、そのため誤解を招く恐れがあります。

+0

ありがとうございます。しかし、私のアルゴリズムをそのまま実行すると。私は少しコヒーレントな結果を得るか、またまあまあの行列を使用せず、コサインの距離ではないという結果が、私の結果を完全に役に立たなくするでしょうか? – mel

+1

おそらくうまくいくかもしれません。 「StandardScaler」は、連続した高密度データのためのものでもあります。それはクラッシュしません。しかし、コサインベースのアプローチでは、おそらくより良い結果が得られます。そしてあなたはまだイプシロンを知らないので、もっと何かをしなければならないでしょう... –

関連する問題