Python 3.x python中的散点图,用于表示靠近质心的点,用于K均值聚类

Python 3.x python中的散点图,用于表示靠近质心的点,用于K均值聚类,python-3.x,matplotlib,Python 3.x,Matplotlib,我正在为聚类编写一个简单的K-means算法,并试图绘制一个散点图,显示样本数据(从CSV文件加载到numpy矩阵X中的样本数据行) 假设X是一个numpy矩阵,每行包含10个特征的示例数据。在我的例子中,它们是包含src IP地址、目标IP地址、src端口或目标端口的网络流的属性。 我还计算了K-均值的质心(其中K是总质心)。我有一个列表idx,它只是单个X行所属的形心的索引。例如,如果X numpy矩阵的第5行属于质心=3,则idx[4]=3(因为我们从0开始)。 这样,包含10个特征的单独

我正在为聚类编写一个简单的K-means算法,并试图绘制一个散点图,显示样本数据(从CSV文件加载到numpy矩阵X中的样本数据行)

假设X是一个numpy矩阵,每行包含10个特征的示例数据。在我的例子中,它们是包含src IP地址、目标IP地址、src端口或目标端口的网络流的属性。 我还计算了K-均值的质心(其中K是总质心)。我有一个列表idx,它只是单个X行所属的形心的索引。例如,如果X numpy矩阵的第5行属于质心=3,则idx[4]=3(因为我们从0开始)。 这样,包含10个特征的单独数据记录的X的每一行都属于唯一的质心。 我想画散点图,用X表示数据点,为每个质心分别着色。 例如,如果X的第5行、第8行更接近质心3,我想用不同的颜色给它们上色。 如果我用八度音阶,我可以这样写代码:-

function plotPoints(X,idx,K)
  p= hsv(K+1) % palette
  c= p(idx,:) % color
  scatter(X(:,1),X(:,2),15,c) % plot the scatter plot
但是,在python中,我不知道如何实现相同的功能,以便能够显示具有相同索引分配的数据样本具有相同的颜色。我的代码当前为红色,所有X行显示为红色,所有质心显示为蓝色,如下所示:-

def plotPoints(X,idx,K,centroids):
    srcport=X[:,5]
    dstport=X[:,6]

    fig = plt.figure()
    ax=fig.add_subplot(111,projection='3d')
    ax.scatter(srcport,dstport,c='r',marker='x')
    ax.scatter(centroids[:,5],centroids[:,6],c='b',marker='o', s=160)
    ax.set_xlabel('Source port')
    ax.set_xlabel('Destination port')
    plt.show()
请注意:我只在x&y轴上绘制了2个要素,而不是全部10个要素。我应该早点提到这一点

并在这种绘图中协同工作。
如果它们对你可用,请考虑以下解决方案:

# generate sample data
import numpy as np
values = np.random.random(500).reshape(50,10) * 10
centroid = np.random.choice(np.arange(5), size=50).reshape(-1,1)
data = np.concatenate((values, centroid), axis=1)

# convert to DataFrame
import pandas as pd
colnames = ['a','b','c','d','e','f','g','h','i','j','centroid']
df = pd.DataFrame(data, columns=colnames)

# data frame looks like:
df.head()

   a  b  c  d  e  f  g  h  i  j  centroid
0  6  9  9  9  1  2  4  0  8  9         4
1  9  1  0  0  7  9  9  3  7  2         1
2 10  4  8  7  2  8  9  4  6  8         3
3  2  6  5  2  8  4  9  3  9  5         4
4  9  7  5  1  3  2  1  8  3  4         4

# plot with Seaborn
import seaborn as sns
sns.lmplot(x='a', y='b', hue='centroid', data=df, scatter=True, fit_reg=False)

这里是一个纯Numpy/Pyplot版本,如果您仅限于这些模块:

from matplotlib import pyplot as plt
fig, ax = plt.subplots()

colors = {0:'purple', 1:'red', 2:'blue', 3:'green', 4:'black'}

ax.scatter(x=data[:,0], y=data[:,1], c=[colors[x] for x in data[:,10]])
并在这种绘图中协同工作。
如果它们对你可用,请考虑以下解决方案:

# generate sample data
import numpy as np
values = np.random.random(500).reshape(50,10) * 10
centroid = np.random.choice(np.arange(5), size=50).reshape(-1,1)
data = np.concatenate((values, centroid), axis=1)

# convert to DataFrame
import pandas as pd
colnames = ['a','b','c','d','e','f','g','h','i','j','centroid']
df = pd.DataFrame(data, columns=colnames)

# data frame looks like:
df.head()

   a  b  c  d  e  f  g  h  i  j  centroid
0  6  9  9  9  1  2  4  0  8  9         4
1  9  1  0  0  7  9  9  3  7  2         1
2 10  4  8  7  2  8  9  4  6  8         3
3  2  6  5  2  8  4  9  3  9  5         4
4  9  7  5  1  3  2  1  8  3  4         4

# plot with Seaborn
import seaborn as sns
sns.lmplot(x='a', y='b', hue='centroid', data=df, scatter=True, fit_reg=False)

这里是一个纯Numpy/Pyplot版本,如果您仅限于这些模块:

from matplotlib import pyplot as plt
fig, ax = plt.subplots()

colors = {0:'purple', 1:'red', 2:'blue', 3:'green', 4:'black'}

ax.scatter(x=data[:,0], y=data[:,1], c=[colors[x] for x in data[:,10]])

查看要发布的答案。我猜你的质心指数对应于簇。在这种情况下,您可以使用简单数组作为颜色:

ax.scatter(srcport, dstport, c=idx, marker='x')
ax.scatter(centroids[:,5], centroids[:,6], c=np.arange(K), marker='o', s=160)
或使用:


查看要发布的答案。我猜你的质心指数对应于簇。在这种情况下,您可以使用简单数组作为颜色:

ax.scatter(srcport, dstport, c=idx, marker='x')
ax.scatter(centroids[:,5], centroids[:,6], c=np.arange(K), marker='o', s=160)
或使用:


讨论可能对您有用的各种选项。您确实需要在3D中绘图吗?实际上,我不需要。但是它看起来有点可爱。在这种情况下,请看下面我的答案——它应该达到你想要的效果,减去3D。讨论可能对您有用的各种选项。您确实需要在3D中绘图吗?实际上,我不需要。但是它看起来有点可爱。在这种情况下,请看下面我的答案——它应该达到你想要的效果,减去3D。谢谢安德鲁·里斯的回答。这个解决方案所面临的挑战是,我不知道要提前开始多少质心。我运行的成本函数,以确定最理想的成本,并认为这是我的价值K。因此,如果我使用一个静态字典的颜色,它不会缩放。如果您看到我的倍频程代码,我会从由K定义的调色板中选择颜色。这只是Matplotlib的一个问题-Pandas/Seaborn解决方案将自动将颜色数量缩放到
质心
向量中的质心数量。如果要使用Matplotlib解决方案,可以使用
cmap
而不是静态颜色映射。感谢Andrew_reece的回复。这个解决方案所面临的挑战是,我不知道要提前开始多少质心。我运行的成本函数,以确定最理想的成本,并认为这是我的价值K。因此,如果我使用一个静态字典的颜色,它不会缩放。如果您看到我的倍频程代码,我会从由K定义的调色板中选择颜色。这只是Matplotlib的一个问题-Pandas/Seaborn解决方案将自动将颜色数量缩放到
质心
向量中的质心数量。如果要使用Matplotlib解决方案,可以使用
cmap
而不是静态颜色映射。谢谢,这很有意义!。让我试试。谢谢,这很有道理!。让我试试看。