如何使用距离矩阵和 kmedoids 将新观察值分配给聚类?
How to assign new observations to cluster using distance matrix and kmedoids?
我有一个数据框,它保存数据框中每个文档之间的 Word Mover 距离。我在这上面 运行 kmediods 来生成集群。
1 2 3 4 5
1 0.00 0.05 0.07 0.04 0.05
2 0.05 0.00 0.06 0.04 0.05
3. 0.07 0.06 0.00 0.06 0.06
4 0.04 0.04. 0.06 0.00 0.04
5 0.05 0.05 0.06 0.04 0.00
kmed = KMedoids(n_clusters= 3, random_state=123, method ='pam').fit(distance)
在此初始矩阵上 运行 并生成聚类后,我想添加要聚类的新点。将新文档添加到距离矩阵后,我得到:
1 2 3 4 5 6
1 0.00 0.05 0.07 0.04 0.05 0.12
2 0.05 0.00 0.06 0.04 0.05 0.21
3. 0.07 0.06 0.00 0.06 0.06 0.01
4 0.04 0.04. 0.06 0.00 0.04 0.05
5 0.05 0.05 0.06 0.04 0.00 0.12
6. 0.12 0.21 0.01 0.05 0.12 0.00
我尝试在新行上使用 kmed.predict。
kmed.predict(new_distance.loc[-1: ])
然而,这给了我一个尺寸不兼容的错误 X.shape[1] == 6
而 Y.shape[1] == 5
.
如何使用新文档的这个距离来确定它应该属于哪个集群?这甚至可能吗,还是我每次都必须重新计算集群?谢谢!
k-medoids 的 source code 说明如下:
def transform(self, X):
"""Transforms X to cluster-distance space.
Parameters
----------
X : {array-like, sparse matrix}, shape (n_query, n_features), \
or (n_query, n_indexed) if metric == 'precomputed'
Data to transform.
"""
我假设你使用 precomputed
度量(因为你计算了分类器之外的距离),所以在你的情况下 n_query
是新文档的数量,n_indexed
是调用 fit
方法的文档数。
在您的特定情况下,当您将模型拟合到 5 个文档然后想要对第 6 个文档进行分类时,用于分类的 X
应该具有形状 (1,5)
,可以计算为
kmed.predict(new_distance.loc[-1: , :-1])
这是我的试验,每次都要重新计算新点和旧点的距离。
import pandas as pd
from sklearn_extra.cluster import KMedoids
from sklearn.metrics import pairwise_distances
import numpy as np
# dummy data for trial
df = pd.DataFrame({0: [0,1],1 : [1,2]})
# calculatie distance
distance = pairwise_distances(df.values, df.values)
# fit model
kmed = KMedoids(n_clusters=2, random_state=123, method='pam').fit(distance)
new_point = [2,3]
distance = pairwise_distances(np.array(new_point).reshape(1, -1), df.values)
#calculate the distance between the new point and the initial dataset
print(distance)
#get ride of the last element which is the ditance of the new point with itself
print(kmed.predict(distance[0][:2].reshape(1, -1)))
我有一个数据框,它保存数据框中每个文档之间的 Word Mover 距离。我在这上面 运行 kmediods 来生成集群。
1 2 3 4 5
1 0.00 0.05 0.07 0.04 0.05
2 0.05 0.00 0.06 0.04 0.05
3. 0.07 0.06 0.00 0.06 0.06
4 0.04 0.04. 0.06 0.00 0.04
5 0.05 0.05 0.06 0.04 0.00
kmed = KMedoids(n_clusters= 3, random_state=123, method ='pam').fit(distance)
在此初始矩阵上 运行 并生成聚类后,我想添加要聚类的新点。将新文档添加到距离矩阵后,我得到:
1 2 3 4 5 6
1 0.00 0.05 0.07 0.04 0.05 0.12
2 0.05 0.00 0.06 0.04 0.05 0.21
3. 0.07 0.06 0.00 0.06 0.06 0.01
4 0.04 0.04. 0.06 0.00 0.04 0.05
5 0.05 0.05 0.06 0.04 0.00 0.12
6. 0.12 0.21 0.01 0.05 0.12 0.00
我尝试在新行上使用 kmed.predict。
kmed.predict(new_distance.loc[-1: ])
然而,这给了我一个尺寸不兼容的错误 X.shape[1] == 6
而 Y.shape[1] == 5
.
如何使用新文档的这个距离来确定它应该属于哪个集群?这甚至可能吗,还是我每次都必须重新计算集群?谢谢!
k-medoids 的 source code 说明如下:
def transform(self, X):
"""Transforms X to cluster-distance space.
Parameters
----------
X : {array-like, sparse matrix}, shape (n_query, n_features), \
or (n_query, n_indexed) if metric == 'precomputed'
Data to transform.
"""
我假设你使用 precomputed
度量(因为你计算了分类器之外的距离),所以在你的情况下 n_query
是新文档的数量,n_indexed
是调用 fit
方法的文档数。
在您的特定情况下,当您将模型拟合到 5 个文档然后想要对第 6 个文档进行分类时,用于分类的 X
应该具有形状 (1,5)
,可以计算为
kmed.predict(new_distance.loc[-1: , :-1])
这是我的试验,每次都要重新计算新点和旧点的距离。
import pandas as pd
from sklearn_extra.cluster import KMedoids
from sklearn.metrics import pairwise_distances
import numpy as np
# dummy data for trial
df = pd.DataFrame({0: [0,1],1 : [1,2]})
# calculatie distance
distance = pairwise_distances(df.values, df.values)
# fit model
kmed = KMedoids(n_clusters=2, random_state=123, method='pam').fit(distance)
new_point = [2,3]
distance = pairwise_distances(np.array(new_point).reshape(1, -1), df.values)
#calculate the distance between the new point and the initial dataset
print(distance)
#get ride of the last element which is the ditance of the new point with itself
print(kmed.predict(distance[0][:2].reshape(1, -1)))