乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: MSasu

[编程交流] 从f建立一条平均线

[复制链接]

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:04:54 | 显示全部楼层
 
谢谢Stefan!
您的代码产生了良好的结果。
回复

使用道具 举报

29

主题

519

帖子

477

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-5 18:08:04 | 显示全部楼层
@李
 
您的代码适用于三维点还是仅适用于二维点?我在一批3D点上试用了它,结果很奇怪,而Stefan的结果似乎很管用。
 
经过进一步检查,Stefan的代码生成了一条穿过三维点的连接线,但它只是一个二维实体。
 
有没有可能仅仅通过点簇创建一条与XLINE或光线平行的线?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:11:38 | 显示全部楼层
 
嗨,小家伙,
 
由于我的代码使用简单线性回归,它将只适用于2变量系统,即2D点;当然,更高维度的线性回归是可能的,但要复杂一些。
回复

使用道具 举报

29

主题

519

帖子

477

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-5 18:13:47 | 显示全部楼层
 
谢谢李,我想可能是这样的。我有来自3D点云的点子集,大约200个点,需要获得点的最佳3D拟合线。有什么想法可以实现吗?
回复

使用道具 举报

29

主题

519

帖子

477

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-5 18:17:54 | 显示全部楼层
我的LISP确实很生疏,所以我在VBA中实现了它,并在点簇中画了一条线。我现在打算做进一步的线性回归,但使用点的X和Z坐标来获得通过点的线的梯度。三维线性回归所需的数学知识超出了我的能力。
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 18:21:03 | 显示全部楼层
在原始问题的背景下,我认为Stefan的解决方案优于
对直线应用正交回归,并最小化点到直线的距离。
 
Lee的解决方案(杰出的实现)是另一个beast,它将沿Y坐标到直线的距离缩小,当X被视为独立变量时,它是完全正确的。
 
该问题的解决方案首次发表在R.J.ADCOCK出版的《分析员》第5卷第2期(1878年3月)第53-54页。
这是本文的链接:最小二乘法中的一个问题
 
它也称为戴明回归或正交回归。
 
ymg公司
 
这是一张来自维基百科的图片,展示了斯特凡的解决方案:

                               
登录/注册后可看大图

 
以下是李正在最小化的内容:
 
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:24:11 | 显示全部楼层
非常有趣且信息丰富的比较ymg-感谢您提供的信息!
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 18:26:18 | 显示全部楼层
泰克,
 
这是3D中的正交回归。
 
可能已经太晚了,但我正忙于其他事情。
 
代码还可以,但我仍然需要添加一个残差表来分析结果。
 
公式推导见:Jean Jacquelin的三维线性回归
 
ymg公司
 
  1. ;; fl3d, Orthogonal Regression in 3D   by ymg                                  ;
  2. ;;                                                                             ;
  3. ;; For Derivation of Formulas See Following Paper:                             ;
  4. ;;        3-D LINEAR REGRESSION  by Jean Jacquelin                             ;
  5. ;; http://www.scribd.com/doc/31477970/Regressions-et-trajectoires-3D           ;
  6. ;;                                                                             ;
  7. (defun c:fl3d (/ *acaddoc* a avg b c0 c1 c2 cos2a cosa errl go k00 k01 k10 k11 k12 k22
  8.                n p phi pl q r rho s2m sin2a sina ss sum sxx sxy sxz syy syz szz u v w xm ym zm)
  9.   (vl-load-com)
  10.   (defun *error* (msg)
  11.              (mapcar 'eval errl)
  12. (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*EXIT*")))
  13.           (princ (strcat "\nError: " msg))
  14.        )
  15. (and *AcadDoc* (vla-endundomark *AcadDoc*))
  16.        (princ)
  17.   )
  18.   (defun acos (z)  (atan (sqrt (- 1.0 (* z z))) z))
  19.   (setq errl '("CMDECHO" "DIMZIN")
  20.         errl (mapcar (function (lambda (a) (list 'setvar a (getvar a)))) errl)
  21.   )
  22.    
  23.    
  24.   (or *AcadDoc*
  25.      (setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object)))
  26.   )
  27.   
  28.   (princ (strcat "\n Select Points"))
  29.   (if (setq  n 0
  30.      pl nil
  31.      ss (ssget '((0 . "POINT")))
  32.             go (> (sslength ss) 2)
  33.       )
  34.      (progn
  35.         (vla-startundomark *AcadDoc*)          
  36.         (setvar 'CMDECHO 0)
  37.         (setvar 'DIMZIN 0)
  38. (repeat (sslength ss)
  39.          (setq pl (cons (cdr (assoc 10 (entget (ssname ss n)))) pl)
  40.                 n (1+ n)
  41.          )
  42. )
  43.         (setq  avg  (mapcar '/  (apply 'mapcar (cons '+ pl)) (list n n n))
  44.                ;dif  (mapcar '(lambda (a) (mapcar '- a avg)) pl)
  45.                sum  (apply
  46.                        'mapcar
  47.                           (cons '+
  48.                              (mapcar
  49.                                 '(lambda (a)
  50.                                      (list (* (car a) (car a))       ;  XX
  51.                                            (* (car a) (cadr a))      ;  XY
  52.                                            (* (cadr a) (cadr a))     ;  YY
  53.                                            (* (car a) (caddr a))     ;  XZ
  54.                                            (* (caddr a) (caddr a))   ;  ZZ
  55.                                            (* (cadr a) (caddr a))    ;  YZ
  56.                                      )
  57.                                  )
  58.                                  pl
  59.                              )
  60.                           )
  61.                     )
  62.                sum  (mapcar '/ sum (list n n n n n n))
  63.                ;; avg contains:  (Xm Ym Zm)                                  ;
  64.                ;; sum contains:  (sXX sXY sYY sXZ sZZ sYZ) Divided by n      ;
  65.                   Xm (car avg) Ym (cadr avg) Zm (caddr avg)
  66.                  Sxx (- (car sum)(* Xm Xm))
  67.                  Sxy (- (cadr sum)(* Xm Ym))
  68.                  Syy (- (caddr sum)(* Ym Ym))
  69.                  Sxz (- (cadddr sum)(* Xm Zm))
  70.                  Szz (- (car (cddddr sum))(* Zm Zm))
  71.                  Syz (- (cadr (cddddr sum))(* Ym Zm))
  72.                    a (/ (atan (/ (* Sxy 2.)(- Sxx Syy))) 2.)         
  73.                 Cosa (cos a)        Sina (sin a)
  74.                Cos2a (* Cosa Cosa) Sin2a (* Sina Sina)            
  75.                  K11 (+ (* (+ Syy Szz) Cos2a) (* (+ Sxx Szz) Sin2a) (* -2. Sxy Cosa Sina))
  76.                  K22 (+ (* (+ Syy Szz) Sin2a) (* (+ Sxx Szz) Cos2a) (*  2. Sxy Cosa Sina))        
  77.                  K12 (+ (* (* Sxy -1.)(- Cos2a Sin2a))(* (- Sxx Syy) Cosa Sina))
  78.                  K10 (+ (* Sxz Cosa)(* Syz Sina))
  79.                  K01 (+ (* Sxz Sina -1.)(* Syz Cosa))
  80.                  K00 (+ Sxx Syy)           
  81.                   c2 (* (+ K00 K11 K22) -1.)
  82.                   c1 (+ (* K00 K11)(* K00 K22)(* K11 K22)(* K01 K01 -1.)(* K10 K10 -1.))
  83.                   c0 (+ (* K01 K01 K11)(* K10 K10 K22)(* -1. K00 K11 K22))
  84.                    p (- c1 (/ (* c2 c2) 3.))
  85.                    q (+ (/ (* 2.0 c2 c2 c2) 27.)(/ (* -1. c1 c2) 3.) c0)
  86.                    R (+ (/ (* q q) 4.)(/ (* p p p) 27.))         
  87.         )
  88.         (if (minusp R)
  89.            (progn
  90.                (setq rho (sqrt (/ (* -1. p p p) 27.))
  91.                      phi (acos (/ q (* -2. rho)))
  92.                      s2m (min (+ (/ c2 -3.)(* 2. (expt rho (/ 1. 3.))(cos (/ phi 3.))))
  93.                               (+ (/ c2 -3.)(* 2. (expt rho (/ 1. 3.))(cos (/ (+ phi pi pi) 3.))))
  94.                               (+ (/ c2 -3.)(* 2. (expt rho (/ 1. 3.))(cos (/ (+ phi pi pi pi pi) 3.))))
  95.                          )
  96.                )      
  97.            )
  98.            (setq s2m (+ (/ c2 -3.)(expt (+ (/ q -2.)(sqrt R)) (/ 1. 3.))(expt (- (/ q -2.)(sqrt R)) (/ 1. 3.))))
  99.         )
  100.         (setq a (+ (* (/ (* -1. K10)(- K11 s2m)) Cosa) (* (/ K01 (- K22 s2m)) Sina))
  101.               b (+ (* (/ (* -1. K10)(- K11 s2m)) Sina) (* (/ (* -1. K01) (- K22 s2m)) Cosa))
  102.               u (* (/ 1. (+ 1. (* a a) (* b b))) (+ (* (+ 1. (* b b)) Xm) (* -1. a b Ym) (* a Zm)))
  103.               v (* (/ 1. (+ 1. (* a a) (* b b))) (+ (* -1 a b Xm) (* (+ 1 (* a a)) Ym) (* b Zm)))
  104.               w (* (/ 1. (+ 1. (* a a) (* b b))) (+ (* a Xm) (* b Ym) (* (+ (* a a) (* b b)) Zm)))
  105.         )      
  106.         (entmakex (list '(0 . "LINE") (cons 10 avg) (cons 11 (list u v w))))
  107.         
  108.         
  109.      )
  110.   )
  111.   (*error* nil)
  112. )
  113. (princ "\nFit a 3D Line to Selection Set of Points, Type FL3D to run")
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 18:28:26 | 显示全部楼层
我使用这个lisp代码
 
  1. 5
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 18:32:33 | 显示全部楼层
Prodromosm,
 
我知道这一个,它来自Cadalyst,做普通最小二乘法。
 
这并不理想,因为您希望将一条线拟合到您测量的点。
斯特凡的那部更好。
 
新的用于三维拟合,也适用于二维线,
然而,可能对舍入更加敏感。我没有检查。
 
ymg公司
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 04:03 , Processed in 0.538821 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表