Sklearn.KMeans() :获取类质心标签并引用数据集
Posted
技术标签:
【中文标题】Sklearn.KMeans() :获取类质心标签并引用数据集【英文标题】:Sklearn.KMeans() : Get class centroid labels and reference to a dataset 【发布时间】:2015-02-14 18:40:45 【问题描述】:Sci-Kit 学习 Kmeans 和 PCA 降维
我有一个 2M 行乘 7 列的数据集,其中包含不同的家庭用电量测量值以及每次测量的日期。
日期, Global_active_power, Global_reactive_power, 电压, 全球强度, Sub_metering_1, Sub_metering_2, Sub_metering_3我将我的数据集放入 pandas 数据框中,选择除日期列之外的所有列,然后执行交叉验证拆分。
import pandas as pd
from sklearn.cross_validation import train_test_split
data = pd.read_csv('household_power_consumption.txt', delimiter=';')
power_consumption = data.iloc[0:, 2:9].dropna()
pc_toarray = power_consumption.values
hpc_fit, hpc_fit1 = train_test_split(pc_toarray, train_size=.01)
power_consumption.head()
我使用 K-means 分类,然后使用 PCA 降维来显示。
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA
hpc = PCA(n_components=2).fit_transform(hpc_fit)
k_means = KMeans()
k_means.fit(hpc)
x_min, x_max = hpc[:, 0].min() - 5, hpc[:, 0].max() - 1
y_min, y_max = hpc[:, 1].min(), hpc[:, 1].max() + 5
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02), np.arange(y_min, y_max, .02))
Z = k_means.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(1)
plt.clf()
plt.imshow(Z, interpolation='nearest',
extent=(xx.min(), xx.max(), yy.min(), yy.max()),
cmap=plt.cm.Paired,
aspect='auto', origin='lower')
plt.plot(hpc[:, 0], hpc[:, 1], 'k.', markersize=4)
centroids = k_means.cluster_centers_
inert = k_means.inertia_
plt.scatter(centroids[:, 0], centroids[:, 1],
marker='x', s=169, linewidths=3,
color='w', zorder=8)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
plt.show()
现在我想找出哪些行属于给定类,然后哪些日期属于给定类。
有什么方法可以将图表上的点与我的索引相关联 数据集,在 PCA 之后? 一些我不知道的方法? 还是我的方法存在根本缺陷? 有什么建议吗?我对这个领域还很陌生,正在尝试阅读大量代码,这是我看过的几个示例的汇编。
我的目标是对数据进行分类,然后获取属于某个类别的日期。
谢谢
【问题讨论】:
【参考方案1】:KMeans().predict(X) ..docs here
预测 X 中每个样本所属的最近聚类。
在向量量化文献中,cluster_centers_被称为码本,predict返回的每个值都是码本中最接近的码的索引。
Parameters: (New data to predict)
X : array-like, sparse matrix, shape = [n_samples, n_features]
Returns: (Index of the cluster each sample belongs to)
labels : array, shape [n_samples,]
你提交的代码我的问题是使用
train_test_split()
它会在您的数据集中返回两个随机行数组,从而有效地破坏您的数据集顺序,从而难以将 KMeans 分类返回的标签与数据集中的连续日期相关联。
这是一个例子:
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
#read data into pandas dataframe
df = pd.read_csv('household_power_consumption.txt', delimiter=';')
#convert merge date and time colums and convert to datetime objects
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
df.set_index(pd.DatetimeIndex(df['Datetime'],inplace=True))
df.drop(['Date','Time'], axis=1, inplace=True)
#put last column first
cols = df.columns.tolist()
cols = cols[-1:] + cols[:-1]
df = df[cols]
df = df.dropna()
#convert dataframe to data array and removes date column not to be processed,
sliced = df.iloc[0:, 1:8].dropna()
hpc = sliced.values
k_means = KMeans()
k_means.fit(hpc)
# array of indexes corresponding to classes around centroids, in the order of your dataset
classified_data = k_means.labels_
#copy dataframe (may be memory intensive but just for illustration)
df_processed = df.copy()
df_processed['Cluster Class'] = pd.Series(classified_data, index=df_processed.index)
现在您可以在右侧看到与数据集匹配的结果。 既然它已被分类,那么由您来获得意义。 这只是一个很好的整体示例,说明了如何从头到尾使用它。 显示您的结果、查看 PCA 或根据类别制作其他图表。
【讨论】:
我只是没有看到 .labels 定义.. IPython 笔记本,使用 '?',它有帮助,例如 KMeans().labels_? 如果在 KMeans 方法中我指定算法随机化我的数据,则通过应用其他方法和属性(例如:fit()、labels_)获得的结果以与原始 DataFrame 相同的顺序返回(有有序索引)还是按随机行的顺序返回? 有人知道如何预测计算标签吗?它是否使用质心寻找方法?哪一个?以上是关于Sklearn.KMeans() :获取类质心标签并引用数据集的主要内容,如果未能解决你的问题,请参考以下文章
sklearn KMeans 中 KMeans.cluster_centers_ 的值
使用sklearn Kmeans时如何避免Kmean局部最优