在单一特征数据框中查找质心与点之间的距离 – KMeans

我正在使用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默认使用欧几里得距离,但你也可以使用其他度量方法(对于只有一个特征的数据集,这并不重要)。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注