私はTfidfVectorizerトランスフォームを行った後に、コサイン_ディスタンスをメトリックとして、DBSCANを使用して文字列の束をクラスタリングしようとしています。 2つの弦があるとします。それらの間のcosine_distance(sklearn.metrics.pairwise.cosine_distanceを使用して計算されたもの)は、それらが2つの文字列である場合、それらが大規模なデータセット(他の多くの文字列を含む)の一部である場合の距離とは異なります。2つの文字列間のsklearn cosine_distancesは、合計データセットのサイズによって異なりますか?
なぜこのようなことが起こり、2つの文字列の間の距離が、そのデータセットのサイズに関係なく同じであることを確認するにはどうすればよいですか?
このように、私のDBSCANはクラスタリングを確実に行うことができます!
EDIT:要求されたとして、サンプルコードを追加:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_distances
X = [
'this is a string',
'this was a string'
]
Y = [
'this could be a string',
'this may be a string'
]
Z = [
'this is a string',
'this was a string',
'this could be a string',
'this may be a string'
]
for d in [X, Y, Z]:
tv = TfidfVectorizer()
print(cosine_distances(tv.fit_transform(d)))
出力:
[[ 0. 0.49689739]
[ 0.49689739 0. ]]
[[ 0. 0.39702518]
[ 0.39702518 0. ]]
[[ 0. 0.64740127 0.70225689 0.70225689]
[ 0.64740127 0. 0.70225689 0.70225689]
[ 0.70225689 0.70225689 0. 0.46163155]
[ 0.70225689 0.70225689 0.46163155 0. ]]
あなたがここに見ることができるように、this is a string
とthis was a string
の間の距離は、データセットX
で0.497
ですが、それは0.647
データセットZ
。ストリングthis could be a string
とthis may be a string
データセットY
における上記の例では
Z
に対して同じ、IはDBSCANの最大距離(EPS)のパラメータは、その後、データセットXに、0.6であることを選択した場合、両方の文字列が同じクラスタに置かれます、データセットZでは、それらは異なるクラスタに配置されます。
あなたの目標をより明確にするために例/コードを追加してください – sera