Ich versuche Cluster Strings mit DBSCAN, mit Cosine_distances als die Metrik nach TfidfVectorizer Transformation Cluster. Sag, ich habe zwei Saiten. Der cosine_distance zwischen ihnen (berechnet mit sklearn.metrics.pairwise.cosine_distance), wenn es nur diese beiden Strings sind, ist der Abstand zwischen ihnen, wenn sie Teil eines größeren Datensatzes sind (mit vielen anderen Strings).sklearn cosine_distances zwischen zwei Strings variiert je nach Größe des gesamten Datensatzes?
Warum passiert das und wie kann ich sicherstellen, dass der Abstand zwischen zwei Strings unabhängig von der Größe des Datasets, aus dem sie bestehen, gleich ist?
Auf diese Weise kann mein DBSCAN Clustering zuverlässig durchführen!
EDIT: Hinzufügen von Beispielcode wie gewünscht:
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)))
Ausgänge:
[[ 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. ]]
Wie man hier sehen kann, ist der Abstand zwischen this is a string
und this was a string
ist 0.497
in Dataset X
, aber es ist 0.647
im Datensatz Z
. Das Gleiche gilt für strings this could be a string
und this may be a string
in Datensätze Y
und Z
In dem obigen Beispiel, wenn I max Abstand (EPS) Parameter DBSCAN wählte 0,6, dann in-Datensatz X zu sein, werden beide Zeichenketten im gleichen Cluster gesetzt werden, aber im Datensatz Z werden sie in verschiedene Cluster eingefügt.
fügen Sie bitte ein Beispiel/einen Code hinzu, um Ihr Ziel klarer zu machen – sera