skspatial.objects.Plane.best_fit

classmethod Plane.best_fit(points: Union[numpy.ndarray, Sequence], tol: Optional[float] = None, **kwargs) skspatial.objects.plane.Plane[source]

Return the plane of best fit for a set of 3D points.

Parameters
pointsarray_like

Input 3D points.

tolfloat | None, optional

Keyword passed to Points.are_collinear() (default None).

kwargsdict, optional

Additional keywords passed to numpy.linalg.svd()

Returns
Plane

The plane of best fit.

Raises
ValueError

If the points are collinear or are not 3D.

References

Using SVD for some fitting problems Inge Söderkvist Algorithm 3.1 https://www.ltu.se/cms_fs/1.51590!/svd-fitting.pdf

Examples

>>> from skspatial.objects import Plane
>>> points = [[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]]
>>> plane = Plane.best_fit(points)

The point on the plane is the centroid of the points.

>>> plane.point
Point([0.25, 0.25, 0.25])

The plane normal is a unit vector.

>>> plane.normal.round(3)
Vector([-0.577, -0.577, -0.577])
>>> points = [[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0]]
>>> Plane.best_fit(points)
Plane(point=Point([0.5, 0.5, 0. ]), normal=Vector([0., 0., 1.]))
>>> Plane.best_fit(points, full_matrices=False)
Plane(point=Point([0.5, 0.5, 0. ]), normal=Vector([0., 0., 1.]))