为了进行线性回归,我正在生成一些合成数据样本,如下所示。
首先,它生成了包含3个特性(由x_data表示)的2000个样本。然后通过一个小的仿真,生成y_data (结果为实y)。即假设一个线性相关模型:虚权(用w_real表示),偏置(用b_real表示),加上一些噪声。
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#create some test data and simulate results
x_data = np.random.randn(2000,3)
w_real = [0.3,0.5,0.1]
b_real = -0.2
noise = np.random.randn(1,2000)*0.1
y_data = np.matmul(w_real,x_data.T) + b_real + noise
print(len(x_data))
print(len(y_data[0]))
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x1 = x_data[:,0]
x2 = x_data[:,1]
x3 = x_data[:,2]
ax.scatter3D(x1, x2, x3, c=x3, cmap='Greens');
plt.show()
#actual implementation of liner regression
#compute y_pred, compare with y_data above etc etc
#assume more code here
exit() 我试图使用matplotlib可视化上述模拟样本(x_data和y_data)。我能够绘制x_data,如下图所示。我也想形象化的模拟结果(y_data)在这幅图上,可能会有不同的颜色。它背后的动机是形象化x& y之间的关系。我怎么能这样描绘它呢?
数据维度:
x_data:2000 \times 3y_data:2000 \times 1下面是上面的示例显示样本数据的方式,

以下是我希望取得的成就的一个例子。图中用直线表示两种不同的假设,在我的例子中,我想画一条代表y_data的单条线。

发布于 2020-03-07 14:58:03
如果存在两个以上的变量,则存在维度问题。在这里,有3个变量和一个输出,您将需要一个4维图,这是不可能的,除非你使用一些技巧。
的维度
一般说来,如果你需要观察一个维度太大的问题,你可以减少它的维度。只观察一个或两个变量之间的关系。当然,这意味着你很难观察到更复杂的关系。
举个例子来说,这意味着独立地绘制(X1,X2),(X2,X3)和(X1,X3):
ax.scatter(x1, x2, y_data[0], c=y_data[0], cmap='viridis');
老实说,这并不理想,因为某些观点可能会使另一些人恢复。这可以通过在点(参数α)上添加一些透明性来解决,但是它并没有那么大地改善视觉效果。我建议从1D图开始(y相对于另一个变量),以真正了解正在发生的事情:
plt.scatter(x1, y_data[0], c=y_data[0], cmap='viridis');
向图中添加第四维的一种方法是利用颜色。它有一些限制(你需要一个良好的色标:如果打印在B&W中,它仍然会呈现,一个是色盲友好的)。实际上,它不会适用于3个以上的变量。
举个例子来说,这意味着:
ax.scatter3D(x1, x2, x3, c=y_data[0], cmap='viridis');
这面临着上面提到的可读性问题(但我发现颜色带来了一些信息,而不是重复垂直轴上的内容)。
一种选择是使图形具有交互性,并以类似于巧妙的方式。(更多信息,在这里:https://plot.ly/python/3d-scatter-plots/)
另一种向图中添加维数的方法是绘制等高线曲线,它表示给定相同y的X值的集合。请注意,您不会得到任何“代表y_data的单行”。一般来说,我很肯定这不会很好地渲染在3D (绘制一个三维曲线的集合),除了你的线性回归问题(你会得到一个三维平面的集合)。同样,主要的选择是绘制问题的简化版本,即带有2D等高线曲线的2D绘图。
这种方法的一个主要要求是,您需要提供X和y之间的关系,这是未知的。因此,你必须建立一个模型,并使它适应你想要的情节。
对于线性回归,您可以得到如下内容:
得到估计的模型:
w_est = [0.29,0.51,0.09]
b_est = -0.19
def output_X1_X2(X1, X2):
return X1*w_est[0] + X2*w_est[1] + 0 * w_est[2] + b_est 设置用于绘图的值:
x1_plot = np.linspace(-3, 3, 50)
x2_plot = np.linspace(-3, 3, 50)
X1_plot, X2_plot = np.meshgrid(x1_plot, x2_plot)
Y = output_X1_X2(X1_plot, X2_plot)绘制输出和相关轮廓:
contours = plt.contour(X1_plot, X2_plot, Y, 20, colors='black')
plt.clabel(contours, inline=True, fontsize=8)
plt.imshow(Y, extent=[0, 3, 0, 3], origin='lower',
cmap='viridis')
plt.colorbar();
对于X1和X2,您可以得到一个y值不同的图。主要的缺点是:您没有看到与X3的交互,您必须设置一个给定的X3 (这里为0)。这意味着您必须用(X2,X3)和(X1,X3)绘制类似的图,另外,还必须将所设置的变量移动到除0以外的值。即使这可以被自动化,它也会很快带来很多变量的痛苦。
https://datascience.stackexchange.com/questions/27740
复制相似问题