Python 3.x python中的散点图,用于表示靠近质心的点,用于K均值聚类
我正在为聚类编写一个简单的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,我想用不同的颜色给它们上色。 如果我用八度音阶,我可以这样写代码:-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个特征的单独
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
而不是静态颜色映射。谢谢,这很有意义!。让我试试。谢谢,这很有道理!。让我试试看。