我正在使用KMeans进行异常检测任务。
我使用的Pandas数据框只有一个特征,类似于以下内容:
df = array([[12534.], [12014.], [12158.], [11935.], ..., [ 5120.], [ 4828.], [ 4443.]])
我可以使用以下指令来拟合和预测值:
km = KMeans(n_clusters=2)km.fit(df)km.predict(df)
为了识别异常,我希望计算每个点与质心之间的距离,但对于只有一个特征的数据框,我不确定这是否是正确的做法。
我找到了一些使用欧几里得距离来计算距离的例子。一个例子如下:
def k_mean_distance(data, cx, cy, i_centroid, cluster_labels): distances = [np.sqrt((x - cx) ** 2 + (y - cy) ** 2) for (x, y) in data[cluster_labels == i_centroid]] return distancescentroids = self.km.cluster_centers_distances = []for i, (cx, cy) in enumerate(centroids): mean_distance = k_mean_distance(day_df, cx, cy, i, clusters) distances.append({'x': cx, 'y': cy, 'distance': mean_distance})
这个代码对我来说不起作用,因为在我只有一个特征的数据框的情况下,质心如下所示:
array([[11899.90692187], [ 5406.54143126]])
在这种情况下,查找质心与点之间的距离的正确方法是什么?这是可能的吗?
谢谢你,很抱歉问了一个简单的问题,我还在学习中
回答:
你可以使用scipy.spatial.distance.cdist
来创建一个距离矩阵:
from scipy.spatial.distance import cdistdm = cdist(df, centroids)
这应该会给你一个二维数组,其中每一行代表原始数据集中的一个观测值,每一列代表一个质心。第x行第y列的值表示你的第x个观测值与第y个聚类质心之间的距离。cdist
默认使用欧几里得距离,但你也可以使用其他度量方法(对于只有一个特征的数据集,这并不重要)。