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 featuresX = df.loc[:, features].values# Standardizing the featuresX = StandardScaler().fit_transform(X)tsne = TSNE(n_components=3, n_jobs=5).fit_transform(X)
我想将我的5个特征映射到二维或三维图中。我有点困惑该怎么做。我怎样才能从这些信息中构建一个图表呢?
回答:
你已经完成了大部分工作。t-SNE是一种常见的可视化方法,用于理解高维数据,现在变量tsne
是一个数组,其中每一行代表从所得嵌入中获得的一组(x, y, z)坐标。你可以使用其他可视化方法,但t-SNE可能是一个好的起点。
至于实际查看结果,尽管你已经有了坐标,你仍然需要以某种方式绘制它们。matplotlib
库是一个不错的选择,这里我们将使用它。
绘制二维图你有几种选择。你可以保持大部分代码不变,只需执行2D t-SNE即可
tsne = TSNE(n_components=2, n_jobs=5).fit_transform(X)
或者你可以只使用你现有的组件,一次查看两个。以下代码片段应该可以处理这两种情况:
import matplotlib.pyplot as pltplt.scatter(*zip(*tsne[:,:2]))plt.show()
zip(*...)
会转置你的数据,以便你可以将x坐标和y坐标分别传递给scatter()
,而[:,:2]
部分选择了两个坐标进行查看。如果你的数据已经是二维的,你可以忽略它,或者你可以用[:,[0,2]]
替换它,以查看高维数据中的第0和第2个特征,而不仅仅是前两个。
绘制三维图代码看起来非常相似,至少对于一个最简版本是这样。
from mpl_toolkits.mplot3d import Axes3Dimport matplotlib.pyplot as pltfig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.scatter(*zip(*tsne))plt.show()
主要区别在于使用了3D绘图库和创建了3D子图。
添加颜色: t-SNE可视化通常在某种程度上进行颜色编码时会更有帮助。一个例子可能是你当前存储在X[:,2]
中的平滑中间价格。对于探索性可视化,我发现二维图更有帮助,所以我将使用它作为例子:
plt.scatter(*zip(*tsne[:,:2]), c=X[:,2])
你仍然需要导入等操作,但通过传递关键字参数c
,你可以对散点图进行颜色编码。要调整这些数值数据的显示方式,你可以使用不同的颜色映射,如下所示:
plt.scatter(*zip(*tsne[:,:2]), c=X[:,2], cmap='RdBu')
顾名思义,这种颜色映射由红色和蓝色之间的渐变组成,X[:,2]
的较低值将对应红色。