在单一特征数据框中查找质心与点之间的距离 – 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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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