我想在我的数据集群中添加一个“球体”

Posted

技术标签:

【中文标题】我想在我的数据集群中添加一个“球体”【英文标题】:I want to add a "spheres" to my data cluster 【发布时间】:2015-09-29 05:58:18 【问题描述】:

我想在我的数据集群中添加一种“球体”。

我的数据集群就是这个,没有“球体”。

这是我的代码

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
style.use('ggplot')
import pandas as pd
from sklearn.cluster import KMeans

MY_FILE='total_watt.csv'
date = []
consumption = []

df = pd.read_csv(MY_FILE, parse_dates=[0], index_col=[0])
df = df.resample('1D', how='sum')
df = df.dropna()

date = df.index.tolist()
date = [x.strftime('%Y-%m-%d') for x in date]
from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder()
date_numeric = encoder.fit_transform(date)
consumption = df[df.columns[0]].values

X = np.array([date_numeric, consumption]).T

kmeans = KMeans(n_clusters=3)
kmeans.fit(X)

centroids = kmeans.cluster_centers_
labels = kmeans.labels_

print(centroids)
print(labels)

fig, ax = plt.subplots(figsize=(10,8))
rect = fig.patch
rect.set_facecolor('#2D2B2B')



colors = ["b.","r.","g."]

for i in range(len(X)):
    print("coordinate:",encoder.inverse_transform(X[i,0].astype(int)), X[i,1], "label:", labels[i])
    ax.plot(X[i][0], X[i][1], colors[labels[i]], markersize = 10)
ax.scatter(centroids[:, 0],centroids[:, 1], marker = "x", s=150, linewidths = 5, zorder = 10)
a = np.arange(0, len(X), 5)
ax.set_xticks(a)
ax.set_xticklabels(encoder.inverse_transform(a.astype(int)))
ax.tick_params(axis='x', colors='lightseagreen')
ax.tick_params(axis='y', colors='lightseagreen')
plt.scatter(centroids[:, 0],centroids[:, 1], marker = "x", s=100, c="black", linewidths = 5, zorder = 10)
ax.set_title('Energy consumptions Clusters (high/medium/low)', color='gold')
ax.set_xlabel('time', color='gold')
ax.set_ylabel('date(year 2011)', color='gold')


plt.show()

“球体”是围绕情节(簇)的区域,如图所示。

我试着用谷歌搜索它。

但是当我输入“matplotlib spheres”时,我无法得到任何结果..

【问题讨论】:

【参考方案1】:

您帖子中的示例图看起来像是由Generalized Gaussian Mixture 生成的,其中每个球体都是高斯二维密度。

我稍后会编写一个示例代码来演示如何在您的数据集上使用GMM 并进行这种绘图。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
style.use('ggplot')
import pandas as pd
# code changes here
# ===========================================
from sklearn.mixture import GMM
# ===========================================
from sklearn.preprocessing import LabelEncoder

# replace it with you file path
MY_FILE='/home/Jian/Downloads/total_watt.csv'

df = pd.read_csv(MY_FILE, parse_dates=[0], index_col=[0])
df = df.resample('1D', how='sum')
df = df.dropna()

date = df.index.tolist()
date = [x.strftime('%Y-%m-%d') for x in date]

encoder = LabelEncoder()
date_numeric = encoder.fit_transform(date)
consumption = df[df.columns[0]].values

X = np.array([date_numeric, consumption]).T


# code changes here
# ===========================================
gmm = GMM(n_components=3, random_state=0)
gmm.fit(X)
y_pred = gmm.predict(X)

# the center is given by mean
gmm.means_

# ===========================================

import matplotlib as mpl
fig, ax = plt.subplots(figsize=(10,8))

for i, color in enumerate('rgb'):
    # sphere background
    width, height = 2 * 1.96 * np.sqrt(np.diagonal(gmm._get_covars()[i]))
    ell = mpl.patches.Ellipse(gmm.means_[i], width, height, color=color)
    ell.set_alpha(0.1)
    ax.add_artist(ell)
    # data points
    X_data = X[y_pred == i]
    ax.scatter(X_data[:,0], X_data[:,1], color=color)
    # center
    ax.scatter(gmm.means_[i][0], gmm.means_[i][1], marker='x', s=100, c=color)


ax.set_title('Energy consumptions Clusters (high/medium/low)', color='gold')
ax.set_xlabel('time', color='gold')
ax.set_ylabel('date(year 2011)', color='gold')
a = np.arange(0, len(X), 5)
ax.set_xticks(a)
ax.set_xticklabels(encoder.inverse_transform(a.astype(int)))
ax.tick_params(axis='x', colors='lightseagreen')
ax.tick_params(axis='y', colors='lightseagreen')

【讨论】:

@SuzukiSoma 刚刚更新了我的帖子。请看一看。 :-) @SuzukiSoma 不客气。很高兴它有帮助。如果您想花一些时间学习sci-kit,可以从其在线用户指南scikit-learn.org/stable/user_guide.html 开始,那里提供了许多有用的概念和示例代码。 对了,你为什么设置2 * 1.96?? @SuzukiSoma 都很好。目标是设置一个双边的置信区间。 1.96 是高斯分布的 2 个标准差。再乘以 2 使其成为双面。 您也可以使用 Kmeans 来做到这一点,计算每个集群中的点与其质心之间的 xy 方向的标准偏差,然后绘制相应的椭圆。

以上是关于我想在我的数据集群中添加一个“球体”的主要内容,如果未能解决你的问题,请参考以下文章

我通过表单接受用户数据,我想在我的 SQL 数据库中添加系统日期和时间,我应该如何使用 JAVA 来完成?

我想在我的表中获取多维数组

我有一个 OpenGL 镶嵌球体,我想在其中切一个圆柱形孔

我想在我的数据库中查找列名 - 可以吗?

我想在我的 vb.net 中更新我的访问数据库,但总是出错

我想在我的映射数组中添加一个新的 segmentId(同名),但 elementId 不同但方法相同