【问题标题】:Scatter plot two feature vector set in same figure散点图两个特征向量集在同一个图中
【发布时间】:2019-12-05 21:26:01
【问题描述】:

我想在同一图中的散点图中绘制两个特征向量。我正在做 MNIST 的 PCA 分析。

当前特征向量我们称之为Elements 有784 行。

print Elements.shape
(784,)

我想在同一图中绘制Elements[-20]Elements[-19] 散点图,并希望实现如下所示。

我正在努力将这两个元素添加到具有不同颜色的同一个图中。

plt.scatter(X[-20], X[-19], c= 'r') 只产生一种颜色,不区分散点值。

正如在下面突出显示的那样,我的一些数据集是重叠的,因此下面的 SO 解决方案不起作用。 SO solution

X[-20]的前20个数据元素如下。

0.00000000e+00  0.00000000e+00  0.00000000e+00  0.00000000e+00
  0.00000000e+00  0.00000000e+00  0.00000000e+00  0.00000000e+00
  0.00000000e+00  0.00000000e+00  0.00000000e+00  0.00000000e+00
  2.84343259e-03  6.22613687e-03 -7.95592208e-15 -1.69063344e-14
  1.34798763e-14  0.00000000e+00  6.36473767e-14 -3.18236883e-14

【问题讨论】:

  • 不知道为什么降级
  • 您可以一个接一个地绘制它们,然后调用plt.show()。对于散点图,您需要一个 Xes 数组和一个 Ys 数组,您能显示Elements[-20]Elements[-19] 中的内容吗?我认为你错过了 Xes。
  • Elements[-20] 是多个值的列表、数组还是单个数字?你能提供该数据的一个子集吗?这是来自您的 PCA 结果还是您仍需要进行 PCA?
  • @BenT 它是一个 len 784 的 numpy 数组。这是我的 PCA 结果。更新了问题,输出 784 个元素中的前 20 个元素
  • 我知道Elements是一个784的数组但是Elemens[-20]也是一个784的数组?你有办法确定你想要红色还是绿色的值吗?您需要有一些阈值条件来确定这种差异,例如所有大于 3 的数字都是绿色的。你能用 Elements[-18] 确定颜色吗?否则你在寻找聚类算法吗?

标签: python matplotlib pca


【解决方案1】:

关于可视化问题

你似乎在你的情节中添加了一个标量。您需要做的是首先分离您的数据,然后为每个集合绘制一个图。像这样:

import numpy as np
import matplotlib.pyplot as plt

def populate(a=2,b=5,dev=10, number=400):
    X = np.random.uniform(0, 50, number)
    Y = a*X+b + np.random.normal(0, dev, X.shape[0])
    return X, Y

num = 3000
x1, y1 = populate(number=num)
x2, y2 = populate(-0.2, 110, number=num)

x = np.hstack((x1, x2))
y = np.hstack((y1, y2))

fig, ax = plt.subplots(nrows=1, ncols=1)

plt.scatter(x[:num], y[:num], color="blue", alpha=0.3)
plt.scatter(x[num:], y[num:], color="red", alpha=0.3)

ax = plt.gca()
howblack = 0.15
ax.set_facecolor((howblack, howblack, howblack))
plt.show()

,结果如下:

有一些数字程序可以分隔您的数据,但这不是可视化问题。有关一些聚类方法,请参阅scikit-learn。在您的示例中,假设 Elements 是某种数组,您需要找到一种方法来分离数据。


关于特征向量

散点图通常假设您至少有 X 和 Y 数据(因此是 2D 或更多)。

您似乎指的是一个特征向量,它显然没有足够的信息,因为一个向量的 700 个维度并不容易显示。因此,您需要在散点图中决定什么是 X,什么是 Y,以及将什么分成不同颜色的群体。

【讨论】:

  • 感谢您的评论。可能我不应该更好地表达它。基本上我有两个元素 X 和 Y,里面有 780 个元素。我认为我们可以忽略 780 元素部分。 X 数据元素代表 5,Y 数据元素代表 6 我要创建的散点图。我无权按摩数据。
【解决方案2】:

我假设您的 X[-20] 和 X[-19] 具有绘制所需的所有数据。 在这种情况下,您只需要重复散点图命令即可。

plt.figure()
plt.scatter(X[-20], c= 'r')
plt.scatter( X[-19], c= 'g')
plt.show()

如果上述代码不是您要查找的内容,则提供数据集示例可能会有所帮助。

【讨论】:

  • 感谢您的建议,但 - scatter 需要两个参数
【解决方案3】:

这个问题在某种程度上不够清晰,所以我会做一些假设并回答它。

假设您从 MNIST 中挑选了 1000 个数字 5 和 6 的样本(28*28 的灰度图像)。因此,您的输入数组和标签数组形状将是 (1000, 786)(1000, )。我会做一些随机数组来演示。

a = np.random.rand(1000, 784)
b = np.random.choice([5, 6], size=1000)

现在,我将对保留所有组件的数据执行 PCA。

pca = PCA(784)
X = pca.fit_transform(a)

X 现在的形状是(1000, 784)

您的情况下的数组 X 已转换。您可以只做X = X.T 并按照其余的答案。

下一步,您需要可视化不同的组件如何区分数字 5 和 6。让我们根据您的问题采用组件 19 和 20。

# get all unique digits
digits = np.unique(b)

# assign color to each digit using colormap
colors = plt.cm.Set1(digits)

# loop over digits and plot scatter plot of c1 and c2 components
c1 = 19
c2 = 20
for i in range(len(digits)):
  rows = b == digits[i]
  plt.scatter(X[rows, c1], X[rows, c2], c=[colors[i]], label=labels[i])
plt.legend()
plt.show()

关于如何设置颜色图,请参考这个很棒的answer

当我执行上述命令时,我得到以下图像。

【讨论】:

    【解决方案4】:

    让我们从 Scikit-Learn 加载 MINST(每个数字的大小为 8x8)

    %matplotlib inline
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.datasets import load_digits
    
    digits = load_digits()
    

    让我们为数字 5 的数据做一个集合 x 和 y 为数字 6 的数据

    j=0
    k=0
    x_target=5
    y_target=6
    for i, val in enumerate(digits.target):
        if val ==x_target:
            if j==0:
                x=digits.data[i,:][:,np.newaxis].T
            else:
                x=np.concatenate([x,digits.data[i,:][:,np.newaxis].T])
            j=j+1
        if val ==y_target:
            if k==0:
                y=digits.data[i,:][:,np.newaxis].T
            else:
                y=np.concatenate([x,digits.data[i,:][:,np.newaxis].T])
            k=k+1
    

    x的形状是:

    x.shape
    Out[3]: (182, 64)
    

    y的形状是:

    y.shape
    Out[4]: (180, 64)
    

    您可以为数字 5 的值绘制带有红点的散点图 和蓝色点代表数字 6 的值

    plt.scatter(x[:, -19], x[:, -20],c='r',alpha=0.5)
    plt.scatter(y[:, -19], y[:, -20],c='b',alpha=0.5)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-19
      • 2019-01-14
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多