散点图两个特征向量在同一图中设置

时间:2019-07-28 06:47:11

标签: python matplotlib pca

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

当前特征向量可称为Elements,具有784行。

print Elements.shape
(784,)

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

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

plt.scatter(X[-20], X[-19], c= 'r')仅产生一种颜色,没有色散值的区别。

由于突出显示了我的某些数据集的重叠,因此下面的SO解决方案不起作用。 SO solution

enter image description here

4 个答案:

答案 0 :(得分:3)

关于可视化问题

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

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()

,结果如下:

separate population in scatter

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


关于特征向量

散点图通常假定您至少具有X和Y数据(所以2D或更多)。

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

答案 1 :(得分:2)

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

class myCustomLayer(Conv2D):

    def build(self, input_shape):        

        self.kernel = self.add_weight(shape=kernel_shape,
                                      initializer=self.kernel_initializer,
                                      name='img_kernel',
                                      regularizer=self.kernel_regularizer,
                                      constraint=self.kernel_constraint)
        # Mask kernel
        self.kernel_mask = K.ones(shape=self.kernel_size + (self.input_dim, self.filters))

        if self.use_bias:
            self.bias = self.add_weight(shape=(self.filters,),
                                        initializer=self.bias_initializer,
                                        name='bias',
                                        regularizer=self.bias_regularizer,
                                        constraint=self.bias_constraint)
        else:
            self.bias = None
        self.built = True

    def call(self, inputs, mask=None):


        img_output = TimeDistributed(Conv2D(self.filters,
            self.kernel_size , 
            strides=self.strides,
            padding=self.padding,
            data_format=self.data_format,
            dilation_rate=self.dilation_rate,
            activation=self.activation,
            use_bias = True,
            kernel_initializer=self.kernel_initializer,            
            bias_initializer=self.bias_initializer,
            kernel_regularizer=self.kernel_regularizer,
            bias_regularizer=self.bias_regularizer,
            bias_constraint=self.bias_constraint,
            kernel_constraint=self.kernel_constraint

        ))(inputs[0])


        mask_output = TimeDistributed(Conv2D(self.filters,
            self.kernel_size, 
            strides=self.strides,
            padding=self.padding,            
            data_format=self.data_format,
            dilation_rate=self.dilation_rate,
            use_bias = False,
            kernel_initializer='Ones',
            activation=None
        ))(inputs[1])

        return [img_output, mask_output]

如果上面的代码不是您想要的,给出一个数据集示例可能会有所帮助。

答案 2 :(得分:0)

这个问题在某种程度上缺乏明确性,所以我会做一些假设并回答它。

假设您从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

当我执行以上命令时,我得到以下图像。 scatter plot PCA components

答案 3 :(得分:0)

让我们从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)

The result is: