• python 最小二乘 leastsq 函数实现 法线式 解决与x轴垂直问题


    当使用y=kx+b时,与x轴垂直的直线无法计算。因此使用法线式ysin(theta)+xcos(theta) = dist。貌似这么用有点复杂了,直接使用ax+by=1不知道能不能计算,未测试。

    1. # 修改自 http://www.cnblogs.com/NanShan2016/p/5493429.html
    2. ### 最小二乘法 python leastsq###
    3. import numpy as np
    4. import math
    5. from scipy.optimize import leastsq
    6. ###采样点(Xi,Yi)###
    7. Xi=np.array([-1,-1])
    8. Yi=np.array([0,10])
    9. # p是个数组,表示所有参数!!!
    10. ### 定义误差函数,拟合y=kx+b,p[0]表示k,p[1]表示b
    11. ### 法线式 y*sin(theta)+x*cos(theta) = dist
    12. def error(p,x,y):
    13. return y*math.sin(p[0])+x*math.cos(p[0])-p[1] #x、y都是列表,故返回值也是个列表
    14. ###主函数从此开始###
    15. # 可能是使用梯度下降法而非矩阵运算,因此需要给定初始参数p0
    16. p0=[0,1]
    17. Para=leastsq(error,p0,args=(Xi,Yi)) #把error函数中除了p以外的参数打包到args中
    18. theta = Para[0][0]
    19. dist = Para[0][1]
    20. print("theta=",theta,' ',"dist=",dist)
    21. ###绘图,看拟合效果###
    22. import matplotlib.pyplot as plt
    23. plt.axis([-10,10,-10,10])
    24. plt.scatter(Xi,Yi,color="red",label="Sample Point",linewidth=3) #画样本点
    25. if theta != 0:
    26. x=np.linspace(-10,10,10)
    27. y=dist/math.sin(theta)-x/math.tan(theta)
    28. else:
    29. x = dist
    30. y = np.linspace(-10,10,10)
    31. plt.plot(x,y,color="orange",label="Fitting Line",linewidth=2) #画拟合直线
    32. plt.legend()
    33. plt.show()




  • 相关阅读:
    1.2 进位运算 & 数据类型 & 变量
    phpcms 下载数统计
    mysql 手动安装
    php 位运算权限问题
    php foreach详解
    文字溢出问题
    webstrom 基本设置
    DEDE利用Ajax实现调用当前登录会员的信息简要说明
    windows服务器
    DedeCms密码解密
  • 原文地址:https://www.cnblogs.com/fly2wind/p/6844520.html
Copyright © 2020-2023  润新知