如何根据条件获取给定数据的 k 聚类平均值?
Posted
技术标签:
【中文标题】如何根据条件获取给定数据的 k 聚类平均值?【英文标题】:How to get k cluster mean for a given data based on a condition? 【发布时间】:2018-10-10 21:00:48 【问题描述】:我有一个 csv 文件,其中包含如下所示的日期和 mse(均方误差)值。
date mse
2018-02-11 14.34
2018-02-12 7.24
2018-02-13 4.5
2018-02-14 3.5
2018-02-16 12.67
2018-02-21 45.66
2018-02-22 15.33
2018-02-24 98.44
2018-02-26 23.55
2018-02-27 45.12
2018-02-28 78.44
2018-03-01 34.11
2018-03-05 23.33
2018-03-06 7.45
... ...
现在我想为小于某个限制的mse
值获取两个集群,例如 40,以便我知道哪个集群的值及其平均值。
现在它通常需要两个参数或一组值。由于我只关心mse
值和它周围的集群,我将另一个参数作为相同大小的值范围传递。这就是我所做的
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
df = pd.read_csv("mse_test.csv", parse_dates=["date"])
# get mse values lesser than 40
f1 = df[df['mse'] < 40].values
# get another list of equal size
f2 = list(range(0, 32)) # 32 is no of mse values below 40
X = np.array(list(zip(f1, f2)))
kmeans = KMeans(n_clusters=2).fit(X)
labels = kmeans.predict(X)
# Centroid values
centroids = kmeans.cluster_centers_
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(X[:, 0], X[:, 1], c=labels)
ax.scatter(centroids[:, 0], centroids[:, 1], marker='*', c='#050505', s=1000)
plt.title('K Mean Classification')
plt.show()
但我收到如下错误
Traceback (most recent call last):
File "/home/souvik/PycharmProjects/Pandas/test.py", line 21, in <module>
kmeans = KMeans(n_clusters=2).fit(X)
File "/home/souvik/app/lib/python3.5/site-packages/sklearn/cluster/k_means_.py", line 887, in fit
X = self._check_fit_data(X)
File "/home/souvik/app/lib/python3.5/site-packages/sklearn/cluster/k_means_.py", line 858, in _check_fit_data
X = check_array(X, accept_sparse='csr', dtype=[np.float64, np.float32])
File "/home/souvik/app/lib/python3.5/site-packages/sklearn/utils/validation.py", line 433, in check_array
array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: setting an array element with a sequence.
我做错了什么?
顺便问一下,有什么方法可以得到 2D 绘图而不是 3D 绘图?
【问题讨论】:
【参考方案1】:在按特定条件过滤后,您可以将 KMeans 直接应用于您的数据框。
在你的情况下,你可以使用:
kmeans = KMeans(n_clusters=2).fit(df.query('mse < 40'))
【讨论】:
但它会影响后续行,例如labels = kmeans.predict(X)
。我现在用什么代替 X?
您可以提取您想要的数据帧然后对其进行操作 df_train = df.query('mse
以上是关于如何根据条件获取给定数据的 k 聚类平均值?的主要内容,如果未能解决你的问题,请参考以下文章
K均值聚类法和系统聚类法有啥区别,这两种聚类方法的适用条件都是啥?