【问题标题】:How to plot a hyperplane in Scatter3D in plotly?如何在 Scatter3D 中绘制超平面?
【发布时间】:2021-05-08 22:35:44
【问题描述】:

我想创建一个程式化的图表来解释 SVM 分类器。

代码和图表:

import plotly.graph_objs as go 
import numpy as np
import pandas as pd
from plotly.subplots import make_subplots

columns = ['x1','y1','z1','x1','y2','z2','xl1','yl1']
x1 = np.random.normal(1,0.2,50)
y1 = np.random.normal(1,0.2,50)
z1 = np.random.normal(2,0.2,50)
xl1 = 50*[2.5]
yl1 = 50*[2.5]

x2 = np.random.normal(2,0.2,50)
y2 = np.random.normal(2,0.2,50)
z2 = np.random.normal(2,0.2,50)

df = pd.DataFrame({'x1' : x1,'y1' : y1,'z1' : z1,
                   'x2' : x2,'y2' : y2,'z2' : z2,
                   'xl1' : xl1,'yl1' : yl1})

fig = make_subplots(rows=2, cols=2,
    specs=[[{"type": "scatter"}, {"type": "scatter3d"}],
           [{"type": "scatter3d"}, {"type": "scatter3d"}]])

fig.add_trace(go.Scatter(x=x1, y=y1, mode='markers'), row=1, col=1)
fig.add_trace(go.Scatter(x=x2, y=y2, mode='markers'), row=1, col=1)
fig.add_trace(go.Scatter(x=[3.5,0], y=[0,2.5], mode='lines'), row=1, col=1)  

fig.add_trace(go.Scatter3d(x=x1, y=y1,z=z1, mode='markers'), row=1, col=2)
fig.add_trace(go.Scatter3d(x=x2, y=y2,z=z2, mode='markers'), row=1, col=2)
fig.add_trace(go.Scatter3d(x=[3.5,0,2.1], y=[0,2.5,2.1], z=100*[1,1,1], mode='lines'), row=1, col=2)

fig.add_trace(go.Scatter3d(x=x1, y=y1,z=z1, mode='markers'), row=2, col=1)
fig.add_trace(go.Scatter3d(x=x2, y=y2,z=z2, mode='markers'), row=2, col=1)

fig.add_trace(go.Scatter3d(x=x1, y=y1,z=z1, mode='markers'), row=2, col=2)

fig.update_layout(height=700, showlegend=False)    
fig.show() 

我想为 4 个图形可视化一个程式化的超平面。 在 subplot 1 中,我只是创建了一条线。 如何在其他 3 个图中实现超车道? (见图)

我找不到一个很好的例子。 Any1 知道一些用于我的目的的智能代码?

【问题讨论】:

    标签: python plotly svm plotly-python


    【解决方案1】:

    假设您安装了一个 SVM 分类器,如下所示,其中 X 是一个包含 3 列(特征)的数组,yX 具有相同的长度并表示类:

    model = SVC(kernel="linear").fit(X, y)
    

    超平面定义为ax+by+cz+d=0,其中x,y,z是三个特征,a,b,c是模型的拟合系数,d是拟合截距。要将超平面表示为z 坐标(第三个特征)的函数,请在xy 坐标(前两个特征)上创建一个网格:

    w = model.coef_[0]
    xx, yy = np.meshgrid(*np.array([X.min(axis=0), X.max(axis=0)])[:,:2].T)
    zz = -(w[0]/w[2])*xx -(w[1]/w[2])*yy - model.intercept_[0]/w[2]
    

    然后,使用plotly 进行可视化:

    go.Figure([go.Scatter3d(x=X[:,0], y=X[:,1], z=X[:,2], mode="markers", showlegend=False,
                            marker=dict(color=y, size=2.5, line=dict(color="black", width=1))),
               go.Surface(x=xx, y=yy, z=zz, opacity=.5, showscale=False,
                          surfacecolor=np.zeros(zz.shape), colorscale=[[0, 'grey']])])
    

    这将创建一个类似于以下的图(没有标记颜色和符号,也没有 x-y 轴上的点):

    【讨论】:

      猜你喜欢
      • 2014-07-13
      • 1970-01-01
      • 2015-02-12
      • 2020-04-11
      • 2016-07-20
      • 2013-04-26
      • 2021-03-09
      • 2018-06-18
      相关资源
      最近更新 更多