python实现最小二乘法

python实现最小二乘法

  • 最小二乘法的思路
  • code

最小二乘法可以用于实现直线拟合和平面几何;我们这里使用最小二乘法实现一个平面几何

最小二乘法的思路

python实现最小二乘法_第1张图片
也可以将矩阵拆开来看

python实现最小二乘法_第2张图片

code

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
 

class Plane_fitting:
    def _init__(self):
        self.X = []     #数据点x轴信息
        self.Y = []     #数据点y轴信息
        self.Z = []     #数据点z轴信息
        
        self.A = None   
        self.B = None
        self.coffe = None

           
    def data_generate(self,a,b,c):
        self.X = np.random.uniform(-10, 10, size=100)
        self.Y = np.random.uniform(-10, 10, size=100)
        self.Z = (a * self.X + b * self.Y + c) + np.random.normal(-1, 1, size=100)
        
    def get_matA(self):
        self.A = np.ones((len(self.X),3))
        self.A[:,0] = self.X
        self.A[:,1] = self.Y
        
    
    def get_matB(self):
        self.B = np.ones((len(self.X),1))
        self.B = self.Z
        
    def get_coffe(self):
        self.get_matA()
        self.get_matB()
        self.coffe = np.dot(np.dot(np.linalg.inv(np.dot(self.A.T,self.A)),self.A.T),self.B)
        print("平面拟合结果为:z = {}* x + {}* y + {}".format(self.coffe[0],self.coffe[1],self.coffe[2]))
    
    def show_res(self):
        
        fig1 = plt.figure()
        ax1 = fig1.add_subplot(111, projection='3d')
        ax1.set_xlabel("x")
        ax1.set_ylabel("y")
        ax1.set_zlabel("z")
        ax1.scatter(self.X,self.Y,self.Z,c='r',marker='o')
        x_p = np.linspace(-10, 10, 100)
        y_p = np.linspace(-10, 10, 100)
        x_p, y_p = np.meshgrid(x_p, y_p)
        z_p = self.coffe[0] * x_p + self.coffe[1] * y_p + self.coffe[2]
        ax1.plot_wireframe(x_p, y_p, z_p, rstride=10, cstride=10)
        plt.show()
        
    def main(self):
        self.data_generate(2,5,6)
        self.get_coffe()
        self.show_res()
        
if  __name__== '__main__':
    PF = Plane_fitting()
    PF.main()
    

你可能感兴趣的:(点云处理,python,最小二乘法,开发语言)