features = ["Ask1", "Bid1", "smooth_midprice", "BidSize1", "AskSize1"]
client = InfluxDBClient(host='127.0.0.1', port=8086, database='data',
username=username, password=password)
series = "DCIX_2016_11_15"
sql = "SELECT * FROM {} where time >= '{}' AND time <= '{}' ".format(series,FROMT,TOT)
df = pd.DataFrame(client.query(sql).get_points())
#Separating out the features
X = df.loc[:, features].values
# Standardizing the features
X = StandardScaler().fit_transform(X)
tsne = TSNE(n_components=3, n_jobs=5).fit_transform(X)
我想将我的 5 个特征映射到 2D 或 3D 图中。我有点困惑如何做到这一点。我怎样才能从这些信息中建立一个情节?
最佳答案
您已经完成了大部分工作。 t-SNE 是用于理解高维数据的常见可视化,现在变量 tsne
是一个数组,其中每一行代表来自获得的嵌入的一组 (x, y, z) 坐标。如果您愿意,您可以使用其他可视化,但 t-SNE 可能是一个不错的起点。
就实际看到的结果而言,即使您有可用的坐标,您仍然需要以某种方式绘制它们。 matplotlib
库是一个不错的选择,我们将在这里使用它。
要在 2D 中绘图 您有几个选项。您可以保持大部分代码相同,只需执行 2D t-SNE
tsne = TSNE(n_components=2, n_jobs=5).fit_transform(X)
或者您可以只使用您拥有的组件,并且一次只查看其中的两个。以下代码段应处理任何一种情况:
import matplotlib.pyplot as plt
plt.scatter(*zip(*tsne[:,:2]))
plt.show()
zip(*...)
转置您的数据,以便您可以将 x 坐标和 y 坐标分别传递给 scatter()
,而 [:,:2]
片段选择两个坐标进行查看。如果你的数据已经是二维的,你可以忽略它,或者你可以用类似 [:,[0,2]]
的东西替换它来查看,例如,高维数据中的第 0 个和第 2 个特征,而不仅仅是前 2 个。要在 3D 中绘图 代码看起来几乎相同,至少对于最小版本。
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(*zip(*tsne))
plt.show()
主要区别在于使用 3D 绘图库和制作 3D 子图。
添加颜色: t-SNE 可视化如果以某种方式进行颜色编码通常会更有帮助。一个例子可能是您当前存储在
X[:,2]
中的平滑中间价。对于探索性可视化,我发现 2D 图更有帮助,因此我将使用它作为示例:plt.scatter(*zip(*tsne[:,:2]), c=X[:,2])
您仍然需要导入等等,但是通过传递关键字参数
c
您可以对散点图进行颜色编码。要调整数字数据的显示方式,您可以使用不同的颜色图,如下所示:plt.scatter(*zip(*tsne[:,:2]), c=X[:,2], cmap='RdBu')
顾名思义,此颜色图由红色和蓝色之间的渐变组成,
X[:,2]
的较低值将对应于红色。关于python - t-SNE 映射到 2D 或 3D 图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51386902/