以下步骤是实现您的结果的一种方法。我使用了Wolfram 语言,但该方法可以通过任何具有正确库的语言应用。
FindClusters
对于 A 类数据 ( dataA),
- 计算
ConvexHullMesh
每个集群的
- 对于 B 类 (
dataB) 中的每个点,计算
RegionDistance
每个 A 类船体的
- 以及
最近的 A 类船体
Pick的
dataB点。
我们可以从对象属性中收集相关的 3D 示例数据。"AdministrativeDivision" Entity
dataA =
Select[FreeQ[_Missing]]@
EntityValue[
EntityClass["AdministrativeDivision", {"ParentRegion" -> Entity["Country", "UnitedStates"]}]
, {"GiniIndex", "TotalVotingRate", "HomeOwnershipRate"}];
First@dataA
{0.4776, 56.3712%, 70.7%}
我使用FindClusters了"MeanShift"集群的方法。发现了两个集群。
clusters = FindClusters[dataA, Method -> "MeanShift"];
Length@clusters
2
每个集群的列表通过ConvexHullMesh以下方式获得
hulls = ConvexHullMesh /@ clusters

通过将 a ListPointPlot3Dofclusters与 a Graphics3Dof hulls(with lowOpacity使它们透明)与结合起来,可以用它们的内部点来可视化它们Show。
cp =
Show[
ListPointPlot3D[
clusters
, PlotStyle -> ColorData[110]
, PlotTheme -> {"Web", "FrameGrid"}
, BoxRatios -> Automatic]
, Graphics3D[
{Opacity[.1]
, MapIndexed[
{ColorData[110] @@ #2, EdgeForm[{Thin, Opacity[.1], ColorData[110] @@ #2}], #1} &
, hulls]}]
]

对于 B 类示例数据,我们需要集群外壳之外的点。我们可以在ofCuboid周围创建一个并通过取. 这个区域可以用 可视化。RegionUnionhullshullsRegionDifferenceRegionPlot3D
With[
{ru = RegionUnion[hulls]}
, rd =
RegionDifference[
Cuboid @@ Transpose[
MapAt[Ceiling[#, 0.01] &, {All, 2}]@
MapAt[Floor[#, 0.01] &, {All, 1}]@
RegionBounds@ru]
, ru]
];
RegionPlot3D[rd
, PlotStyle -> Opacity[.1]
, Axes -> True]

然后我们可以RandomPoint在这个区域内为 生成 s dataB。
SeedRandom[19283745]
dataB = RandomPoint[DiscretizeRegion@rd, 20];
这些dataB点可以与dataA聚类图结合使用Show。所有dataB点都在dataA船体之外。
Show[
cp
, ListPointPlot3D[dataB
, PlotStyle -> Black]
]

现在我们有了示例 B 类数据 ( dataB),我们可以计算RegionDistance每个点到每个 A 类的数据hulls。然后通过Ordering这些距离,First入口给出了点最接近的船体。
nc =
First /@
Ordering /@
Transpose@
Through[
Function[r, RegionDistance[r, #] &, Listable][hulls][dataB]
]
{2, 1, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1}
最后,我们通过它们最近的船体来Pick确定dataB点,并将它们的图与dataA集群图结合起来Show。dataB点已被着色以指示它们最近的dataA集群。
pncB = Pick[dataB, nc, #] & /@ Range@Length@hulls;
Show[
cp
, ListPointPlot3D[
pncB
, PlotStyle -> ColorData[104]
, BoxRatios -> Automatic
]
]

希望这可以帮助。