散点图两个特征向量集在同一图中
Scatter plot two feature vector set in same figure
我想在同一张图中的散点图中绘制两个特征向量。我正在从 MNIST 进行 PCA 分析。
Current Feature Vector 让我们称之为 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
关于可视化问题
您似乎在为绘图添加标量。您需要做的是首先分离您的数据,然后为每个集合绘制图表。像这样:
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 数据(因此是二维或更多)。
您似乎指的是一个特征向量,这显然不是足够的信息,因为一个向量的 700 个维度并不容易显示。所以你需要决定,在你的散点图中什么是 X,什么是 Y,什么要分成不同颜色的群体。
我假设您的 X[-20] 和 X[-19] 具有绘制所需的所有数据。
在这种情况下,您只需要重复散点图命令即可。
plt.figure()
plt.scatter(X[-20], c= 'r')
plt.scatter( X[-19], c= 'g')
plt.show()
如果上面的代码不是您要查找的内容,提供您的数据集示例可能会有所帮助。
这个问题在一定程度上不够明确,所以我会做一些假设并回答。
假设您从 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()
关于如何设置colormap,参考这个很棒的
当我执行上面的命令时,我得到了如下图像。
让我们从 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)
我想在同一张图中的散点图中绘制两个特征向量。我正在从 MNIST 进行 PCA 分析。
Current Feature Vector 让我们称之为 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
关于可视化问题
您似乎在为绘图添加标量。您需要做的是首先分离您的数据,然后为每个集合绘制图表。像这样:
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 数据(因此是二维或更多)。
您似乎指的是一个特征向量,这显然不是足够的信息,因为一个向量的 700 个维度并不容易显示。所以你需要决定,在你的散点图中什么是 X,什么是 Y,什么要分成不同颜色的群体。
我假设您的 X[-20] 和 X[-19] 具有绘制所需的所有数据。 在这种情况下,您只需要重复散点图命令即可。
plt.figure()
plt.scatter(X[-20], c= 'r')
plt.scatter( X[-19], c= 'g')
plt.show()
如果上面的代码不是您要查找的内容,提供您的数据集示例可能会有所帮助。
这个问题在一定程度上不够明确,所以我会做一些假设并回答。
假设您从 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()
关于如何设置colormap,参考这个很棒的
当我执行上面的命令时,我得到了如下图像。
让我们从 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)