我想在同一图中的散点图中绘制两个特征向量。我正在进行MNIST的PCA分析。
当前特征向量可称为Elements
,具有784行。
print Elements.shape
(784,)
我想在同一图中绘制Elements[-20]
和Elements[-19]
散点图,并希望实现如下所示。
我正在努力将两个元素添加到具有不同颜色的同一图中。
plt.scatter(X[-20], X[-19], c= 'r')
仅产生一种颜色,没有色散值的区别。
由于突出显示了我的某些数据集的重叠,因此下面的SO解决方案不起作用。 SO solution
答案 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()
,结果如下:
有一些数字过程可以分离数据,但这不是可视化问题。有关某些群集方法,请参见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
答案 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)