import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%3Ca%20href%3D%22https%3A%2F%2Fcolab.research.google.com%2Fgithub%2Fapplejxd%2Fcolaboratory%2Fblob%2Fmaster%2Falgorithm%2Ffitting.ipynb%22%20target%3D%22_parent%22%3E%3Cimg%20src%3D%22https%3A%2F%2Fcolab.research.google.com%2Fassets%2Fcolab-badge.svg%22%20alt%3D%22Open%20In%20Colab%22%2F%3E%3C%2Fa%3E%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%A4%96%E3%82%8C%E5%80%A4%E3%81%AA%E3%81%97%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E9%99%BD%E9%96%A2%E6%95%B0%E3%81%AE%E5%A0%B4%E5%90%88%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%202%E6%AC%A1%E9%96%A2%E6%95%B0%2B%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83%E8%AA%A4%E5%B7%AE%E3%81%A7%E6%A4%9C%E8%A8%BC%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20np.random.seed(42)%0A%20%20%20%20point_num%3A%20int%20%3D%201000%0A%20%20%20%20_errors%20%3D%20np.random.normal(0%2C%202%2C%20(point_num%2C))%0A%20%20%20%20x%20%3D%20np.linspace(0%2C%2010%2C%20point_num)%0A%20%20%20%20%23%20%E8%AA%A4%E5%B7%AE%0A%20%20%20%20y%20%3D%20x%20**%202%20%2B%20_errors%20%2F%2010%0A%20%20%20%20points%20%3D%20np.vstack(%5Bx%2C%20y%5D).T%0A%20%20%20%20plt.scatter(x%2C%20y%2C%20s%3D0.5)%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20np%2C%20plt%2C%20points%2C%20x%2C%20y%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E9%99%BD%E9%96%A2%E6%95%B0%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%80%82%0A%20%20%20%20%E4%BB%A3%E8%A1%A8%E7%9A%84%E3%81%AA%20Python%20%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE3%E3%81%A4%EF%BC%9A%0A%20%20%20%201.%20%5Bnumpy.polyfit%5D(https%3A%2F%2Fnumpy.org%2Fdoc%2Fstable%2Freference%2Fgenerated%2Fnumpy.polyfit.html)%0A%20%20%20%202.%20%5Bscipy.optimize.curve_fit%5D(https%3A%2F%2Fdocs.scipy.org%2Fdoc%2Fscipy%2Freference%2Fgenerated%2Fscipy.optimize.curve_fit.html)%0A%20%20%20%203.%20%5Bscipy.optimize.leastsq%5D(https%3A%2F%2Fdocs.scipy.org%2Fdoc%2Fscipy%2Freference%2Fgenerated%2Fscipy.optimize.leastsq.html)%0A%0A%20%20%20%20%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%96%B9%E6%B3%95%E3%82%92%E7%A4%BA%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20numpy.polyfit%20%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E8%A1%8C%E3%81%86%E5%A0%B4%E5%90%88%E3%81%AB%E7%B0%A1%E4%BE%BF%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20plt%2C%20points)%3A%0A%20%20%20%20params%2C%20_cov_mat%20%3D%20np.polyfit(points%5B%3A%2C%200%5D%2C%20points%5B%3A%2C%201%5D%2C%20deg%3D2%2C%20cov%3DTrue)%0A%20%20%20%20%23%20%E8%AA%A4%E5%B7%AE%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%82%92%E5%8F%AF%E8%A6%96%E5%8C%96%0A%20%20%20%20plt.imshow(_cov_mat)%0A%20%20%20%20return%20(params%2C)%0A%0A%0A%40app.cell%0Adef%20_(params%2C%20plt%2C%20x%2C%20y)%3A%0A%20%20%20%20def%20quad_func(x%2C%20a%2C%20b%2C%20c)%3A%0A%20%20%20%20%20%20%20%20return%20a*x**2%2Bb*x%2Bc%0A%0A%20%20%20%20plt.scatter(x%2C%20y%2C%20s%3D0.5)%0A%20%20%20%20plt.plot(x%2C%20quad_func(x%2C%20*params)%2C%20color%3D%22orange%22)%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20(quad_func%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20scipy.optimize.curve_fit%20%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20numpy.polyfit%20%E3%81%A8%E6%AF%94%E8%BC%83%E3%81%97%E3%81%A6%E3%80%81%E5%A4%9A%E9%A0%85%E5%BC%8F%E4%BB%A5%E5%A4%96%E3%81%AE%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(plt%2C%20quad_func%2C%20x%2C%20y)%3A%0A%20%20%20%20import%20scipy.optimize%20as%20spo%0A%0A%20%20%20%20p_opt%2C%20p_cov%20%3D%20spo.curve_fit(quad_func%2C%20x%2C%20y)%0A%20%20%20%20%23%20%E8%AA%A4%E5%B7%AE%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%E3%81%AE%E5%8F%AF%E8%A6%96%E5%8C%96%0A%20%20%20%20plt.imshow(p_cov)%0A%20%20%20%20return%20p_opt%2C%20spo%0A%0A%0A%40app.cell%0Adef%20_(p_opt%2C%20plt%2C%20quad_func%2C%20x%2C%20y)%3A%0A%20%20%20%20plt.scatter(x%2C%20y%2C%20s%3D0.5)%0A%20%20%20%20plt.plot(x%2C%20quad_func(x%2C%20*p_opt)%2C%20color%3D%22orange%22)%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20scipy.optimize.leastsq%20%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%90%8D%E5%A4%B1%E9%96%A2%E6%95%B0%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(plt%2C%20points%2C%20quad_func%2C%20spo)%3A%0A%20%20%20%20def%20loss_func(params%2C%20points)%3A%0A%20%20%20%20%20%20%20%20y_est%20%3D%20quad_func(points%5B%3A%2C%200%5D%2C%20*params)%0A%20%20%20%20%20%20%20%20return%20y_est%20-%20points%5B%3A%2C%201%5D%0A%20%20%20%20result%20%3D%20spo.leastsq(loss_func%2C%20(0%2C%200%2C%200)%2C%20args%3Dpoints%2C%20full_output%3DTrue)%0A%20%20%20%20params_1%20%3D%20result%5B0%5D%0A%20%20%20%20_cov_mat%20%3D%20result%5B1%5D%0A%20%20%20%20plt.imshow(_cov_mat)%0A%20%20%20%20return%20(params_1%2C)%0A%0A%0A%40app.cell%0Adef%20_(params_1%2C%20plt%2C%20quad_func%2C%20x%2C%20y)%3A%0A%20%20%20%20plt.scatter(x%2C%20y%2C%20s%3D0.5)%0A%20%20%20%20plt.plot(x%2C%20quad_func(x%2C%20*params_1)%2C%20color%3D'orange')%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E9%99%B0%E9%96%A2%E6%95%B0%E3%81%AE%E5%A0%B4%E5%90%88%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%86%86%2B%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83%E8%AA%A4%E5%B7%AE%E3%81%A7%E6%A4%9C%E8%A8%BC%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20plt)%3A%0A%20%20%20%20point_num_1%20%3D%20500%0A%20%20%20%20_errors%20%3D%200.02%20*%20np.random.normal(0%2C%201%2C%20(point_num_1%2C%202))%0A%20%20%20%20_theta%20%3D%20np.linspace(0%2C%202%20*%20np.pi%2C%20point_num_1)%0A%20%20%20%20radius%2C%20_center%20%3D%20(1.3%2C%20(1%2C%202))%0A%20%20%20%20x_1%20%3D%20radius%20*%20np.cos(_theta)%20%2B%20_center%5B0%5D%20%2B%20_errors%5B%3A%2C%200%5D%0A%20%20%20%20y_1%20%3D%20radius%20*%20np.sin(_theta)%20%2B%20_center%5B1%5D%20%2B%20_errors%5B%3A%2C%201%5D%0A%20%20%20%20points_1%20%3D%20np.vstack(%5Bx_1%2C%20y_1%5D).T%0A%20%20%20%20plt.scatter(points_1%5B%3A%2C%200%5D%2C%20points_1%5B%3A%2C%201%5D%2C%20s%3D0.5)%0A%20%20%20%20plt.axis('equal')%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20(points_1%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20scipy.odr%20%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%5BODR%20(Orthogonal%20Distance%20Regression)%5D(https%3A%2F%2Fpota.hatenablog.jp%2Fentry%2F2014%2F10%2F31%2F033326)%E3%82%92%E5%AE%9F%E6%96%BD%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(plt%2C%20points_1)%3A%0A%20%20%20%20from%20scipy%20import%20odr%0A%0A%20%20%20%20def%20circ_func(beta%2C%20x)%3A%0A%20%20%20%20%20%20%20%20return%20(x%5B0%5D%20-%20beta%5B0%5D)%20**%202%20%2B%20(x%5B1%5D%20-%20beta%5B1%5D)%20**%202%20-%20beta%5B2%5D%20**%202%0A%20%20%20%20_model%20%3D%20odr.Model(circ_func%2C%20implicit%3DTrue)%0A%20%20%20%20_data%20%3D%20odr.Data(points_1.T%2C%20y%3D1)%0A%20%20%20%20_solver%20%3D%20odr.ODR(_data%2C%20_model%2C%20beta0%3D%5B0%2C%200%2C%201%5D)%0A%20%20%20%20result_1%20%3D%20_solver.run()%0A%20%20%20%20result_1.pprint()%0A%20%20%20%20plt.imshow(result_1.cov_beta)%0A%20%20%20%20return%20circ_func%2C%20odr%2C%20result_1%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%8E%A8%E5%AE%9A%E7%B5%90%E6%9E%9C%E3%81%AE%E9%99%B0%E9%96%A2%E6%95%B0%E3%81%AE%E3%83%92%E3%83%BC%E3%83%88%E3%83%9E%E3%83%83%E3%83%97%E3%82%92%E4%BD%9C%E6%88%90(0%E3%81%A8%E3%81%AA%E3%82%8B%E9%83%A8%E5%88%86%E7%A9%BA%E9%96%93%E3%81%8C%E6%8E%A8%E5%AE%9A%E3%83%A9%E3%82%A4%E3%83%B3)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(circ_func%2C%20np%2C%20plt%2C%20points_1%2C%20result_1)%3A%0A%20%20%20%20_diff%20%3D%200.01%0A%20%20%20%20_x_range%20%3D%20np.arange(np.min(points_1%5B%3A%2C%200%5D)%2C%20np.max(points_1%5B%3A%2C%200%5D)%2C%20_diff)%0A%20%20%20%20_y_range%20%3D%20np.arange(np.min(points_1%5B%3A%2C%201%5D)%2C%20np.max(points_1%5B%3A%2C%201%5D)%2C%20_diff)%0A%20%20%20%20X%2C%20Y%20%3D%20np.meshgrid(_x_range%2C%20_y_range)%0A%20%20%20%20Z%20%3D%20circ_func(result_1.beta%2C%20(X%2C%20Y))%0A%20%20%20%20plt.imshow(Z)%0A%20%20%20%20plt.colorbar()%0A%20%20%20%20return%20X%2C%20Y%2C%20Z%0A%0A%0A%40app.cell%0Adef%20_(X%2C%20Y%2C%20Z%2C%20plt%2C%20points_1)%3A%0A%20%20%20%20plt.scatter(points_1%5B%3A%2C%200%5D%2C%20points_1%5B%3A%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'blue')%0A%20%20%20%20plt.contour(X%2C%20Y%2C%20Z%2C%20%5B0%5D%2C%20colors%3D'orange')%0A%20%20%20%20plt.axis('equal')%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20RANSAC%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20RANSAC%20(%E9%99%BD%E9%96%A2%E6%95%B0)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20%E7%9B%B4%E7%B7%9A%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E8%AA%A4%E5%B7%AE%E5%88%86%E5%B8%83%E3%81%A8%E3%81%97%E3%81%A6%E5%A4%96%E3%82%8C%E5%80%A4%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%84%E3%82%B3%E3%83%BC%E3%82%B7%E3%83%BC%E5%88%86%E5%B8%83%E3%82%92%E4%BB%AE%E5%AE%9A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20plt)%3A%0A%20%20%20%20def%20cauchy(x%3A%20np.ndarray)%3A%0A%20%20%20%20%20%20%20%20return%201%20%2F%20np.pi%20%2F%20(1%20%2B%20x%20*%20x)%0A%20%20%20%20x_2%20%3D%20np.linspace(-5%2C%205%2C%20100)%0A%20%20%20%20y_2%20%3D%20cauchy(x_2)%0A%20%20%20%20plt.plot(x_2%2C%20y_2)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E7%94%9F%E6%88%90%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20plt)%3A%0A%20%20%20%20point_num_2%3A%20int%20%3D%201000%0A%20%20%20%20_errors%20%3D%20np.random.standard_cauchy(point_num_2)%0A%20%20%20%20x_3%20%3D%20np.linspace(0%2C%2010%2C%20point_num_2)%0A%20%20%20%20y_3%20%3D%20x_3%20%2B%20_errors%20%2F%2010%0A%20%20%20%20points_2%20%3D%20np.vstack(%5Bx_3%2C%20y_3%5D).T%0A%20%20%20%20plt.scatter(x_3%2C%20y_3%2C%20s%3D0.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20point_num_2%2C%20points_2%2C%20x_3%2C%20y_3%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20iteration%20%E3%81%AE%E5%9B%9E%E6%95%B0%E3%81%AE%E7%9B%AE%E5%AE%89%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE%E9%80%9A%E3%82%8A%EF%BC%9A%0A%0A%20%20%20%201.%20%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E5%B8%83%E3%81%8B%E3%82%89%E3%80%811%E5%9B%9E%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A7%20inlier%20%E3%82%92%E5%BC%95%E3%81%8D%E5%BD%93%E3%81%A6%E3%82%8B%E7%A2%BA%E7%8E%87%20%24e%24%20%E3%82%92%E4%BB%AE%E5%AE%9A%0A%20%20%20%202.%201%E5%9B%9E%E3%81%AE%E8%A9%A6%E8%A1%8C%E3%81%A7%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E6%95%B0%E3%82%92%20%24n%24%20%E3%81%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E3%81%9D%E3%82%8C%E3%82%89%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%8C%E5%85%A8%E3%81%A6%20inlier%20%E3%81%A7%E3%81%82%E3%82%8B%E7%A2%BA%E7%8E%87%E3%81%AF%20%24e%5En%24%0A%20%20%20%203.%20%E4%B8%80%E6%96%B9%E3%81%A7%24N%24%E5%9B%9E%E3%81%AE%E8%A9%A6%E8%A1%8C%E3%81%A7%202.%20%E3%81%8C1%E5%9B%9E%E3%82%82%E7%94%9F%E3%81%98%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88(RANSAC%20%E3%81%8C%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88)%E3%81%AE%E7%A2%BA%E7%8E%87%E3%81%AF%24(1-e%5En)%5EN%24%0A%20%20%20%204.%20%E3%81%A4%E3%81%BE%E3%82%8A%20RANSAC%20%E3%82%92%E3%81%BB%E3%81%BC%E7%A2%BA%E5%AE%9F(%E7%A2%BA%E7%8E%87%24p%5Csim1%24)%E3%81%A7%E6%88%90%E5%8A%9F%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%0A%20%20%20%20%24%24%0A%20%20%20%201-p%3D(1-e%5En)%5EN%E2%87%94N%3D%5Cfrac%7B%5Cln(1-p)%7D%7B%5Cln(1-e%5En)%7D%0A%20%20%20%20%24%24%0A%20%20%20%20%E3%81%8F%E3%82%89%E3%81%84%E3%81%AE%24N%24%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E5%8F%8D%E5%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%204.%20%E6%9B%B4%E3%81%AB%E6%97%A9%E6%9C%9F%E7%B5%82%E4%BA%86%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E6%9C%80%E5%A4%A7%E3%81%AE%20inlier%20%E6%95%B0%E6%9B%B4%E6%96%B0%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%20%24e%5Csim%24%20%20(inlier%20%E3%81%A8%E3%81%97%E3%81%9F%E6%95%B0)%2F(%E3%83%87%E3%83%BC%E3%82%BF%E6%95%B0)%20%E3%81%A8%E3%81%97%E3%81%A6%24N%24%E3%82%92%E6%9B%B4%E6%96%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20%23%20%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E7%9B%AE%E8%A6%96%E7%A2%BA%E8%AA%8D%E3%82%88%E3%82%8A%209%2F10%20%E3%81%AF%E5%AF%BE%E8%B1%A1%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A8%E6%83%B3%E5%AE%9A%0A%20%20%20%20_e%20%3D%209%20%2F%2010%0A%20%20%20%20%23%20%E7%9B%B4%E7%B7%9A%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AF2%E5%80%8B%20%E2%86%92%20%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E6%95%B0%E3%81%AF2%E5%80%8B%E3%81%A7%E5%8D%81%E5%88%86%0A%20%20%20%20_n%20%3D%202%0A%20%20%20%20%23%2099.99%25%20%E3%81%AE%E7%A2%BA%E7%8E%87%E3%81%A7%20RANSAC%20%E3%82%92%E6%88%90%E5%8A%9F%E3%81%95%E3%81%9B%E3%82%8B%0A%20%20%20%20_p%20%3D%200.9999%0A%20%20%20%20%23%20zero%20division%20error%20%E5%AF%BE%E7%AD%96%0A%20%20%20%20max_iteration%20%3D%20int(np.log(1%20-%20_p)%20%2F%20_)%20if%20not%20np.isclose((_%20%3A%3D%20np.log(1%20-%20_e%20**%20_n))%2C%200)%20else%20100000.0%0A%20%20%20%20print(max_iteration)%0A%20%20%20%20return%20(max_iteration%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E4%B9%B1%E6%95%B0%E7%94%9F%E6%88%90%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(max_iteration%2C%20np%2C%20point_num_2%3A%20int)%3A%0A%20%20%20%20index_mat%20%3D%20np.random.randint(0%2C%20point_num_2%2C%20(max_iteration%2C%202))%0A%20%20%20%20print(index_mat)%0A%20%20%20%20return%20(index_mat%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(index_mat%2C%20np%2C%20x_3%2C%20y_3)%3A%0A%20%20%20%20np.array(%5Bx_3%5Bindex_mat%5D%2C%20y_3%5Bindex_mat%5D%5D).shape%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(index_mat%2C%20np%2C%20x_3%2C%20y_3)%3A%0A%20%20%20%20%23%20%E8%BB%A2%E7%BD%AE%E5%89%8D%E3%81%AE%E6%88%90%E5%88%86%E6%95%B0%E3%81%AF%20(axis%2C%20trials%2C%20points)%0A%20%20%20%20%23%20%E8%BB%A2%E7%BD%AE%E5%BE%8C%E3%81%AE%E6%88%90%E5%88%86%E6%95%B0%E3%81%AF%20(trials%2C%20points%2C%20axis)%0A%20%20%20%20samples_tensor%20%3D%20np.array(%5Bx_3%5Bindex_mat%5D%2C%20y_3%5Bindex_mat%5D%5D).transpose(1%2C%202%2C%200)%0A%20%20%20%20print(samples_tensor.shape)%0A%20%20%20%20print(samples_tensor)%0A%20%20%20%20return%20(samples_tensor%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20numpy.polyfit%20%E3%81%A7%E5%82%BE%E3%81%8D%E3%81%A8%E5%88%87%E7%89%87%E8%A8%88%E7%AE%97%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20samples_tensor)%3A%0A%20%20%20%20params_tensor%20%3D%20np.array(%5Bnp.polyfit(sample%5B%3A%2C%200%5D%2C%20sample%5B%3A%2C%201%5D%2C%201)%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20sample%20in%20samples_tensor%5D)%0A%20%20%20%20return%20(params_tensor%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20inlier%20%E3%81%AE%E6%95%B0%E3%82%92%E8%A8%88%E7%AE%97%20%E2%86%92%20%E6%9C%80%E3%82%82%E8%89%AF%E3%81%84%E5%80%99%E8%A3%9C%E3%82%92%E9%81%B8%E6%8A%9E%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20params_tensor%2C%20points_2)%3A%0A%20%20%20%20def%20polynomial(params%2C%20points)%3A%0A%20%20%20%20%20%20%20%20max_degree%20%3D%20len(params)%0A%20%20%20%20%20%20%20%20terms%20%3D%20np.array(%5Bparams%5Bdegree%5D%20*%20points%5B%3A%2C%200%5D%20**%20(max_degree%20-%20degree%20-%201)%20for%20degree%20in%20range(max_degree)%5D)%0A%20%20%20%20%20%20%20%20return%20np.sum(terms%2C%20axis%3D0)%0A%0A%20%20%20%20def%20_get_distances(params%2C%20points)%3A%0A%20%20%20%20%20%20%20%20y_est%20%3D%20polynomial(params%2C%20points)%0A%20%20%20%20%20%20%20%20distances%20%3D%20np.abs(points%5B%3A%2C%201%5D%20-%20y_est)%0A%20%20%20%20%20%20%20%20return%20distances%0A%20%20%20%20_distances_tensor%20%3D%20np.array(%5B_get_distances(params%2C%20points_2)%20for%20params%20in%20params_tensor%5D)%0A%20%20%20%20_distance_th%20%3D%200.3%0A%20%20%20%20inlier_bool_tensor%20%3D%20np.array(%5Bdistances%20%3C%20_distance_th%20for%20distances%20in%20_distances_tensor%5D)%0A%20%20%20%20_inlier_num_array%20%3D%20np.array(%5Bnp.sum(inlier_bool)%20for%20inlier_bool%20in%20inlier_bool_tensor%5D)%0A%20%20%20%20best_idx%20%3D%20np.argmax(_inlier_num_array)%0A%20%20%20%20print(best_idx)%0A%20%20%20%20return%20best_idx%2C%20inlier_bool_tensor%2C%20polynomial%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E7%B5%90%E6%9E%9C%E3%82%92%E7%A2%BA%E8%AA%8D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20best_idx%2C%0A%20%20%20%20inlier_bool_tensor%2C%0A%20%20%20%20np%2C%0A%20%20%20%20params_tensor%2C%0A%20%20%20%20plt%2C%0A%20%20%20%20point_num_2%3A%20int%2C%0A%20%20%20%20points_2%2C%0A%20%20%20%20polynomial%2C%0A)%3A%0A%20%20%20%20params_2%20%3D%20params_tensor%5Bbest_idx%5D%0A%20%20%20%20inlier_idx%20%3D%20np.arange(point_num_2)%5Binlier_bool_tensor%5Bbest_idx%5D%5D%0A%20%20%20%20outlier_idx%20%3D%20np.arange(point_num_2)%5B~inlier_bool_tensor%5Bbest_idx%5D%5D%0A%20%20%20%20plt.scatter(points_2%5Binlier_idx%2C%200%5D%2C%20points_2%5Binlier_idx%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'orange')%0A%20%20%20%20plt.scatter(points_2%5Boutlier_idx%2C%200%5D%2C%20points_2%5Boutlier_idx%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'blue')%0A%20%20%20%20plt.plot(points_2%5B%3A%2C%200%5D%2C%20polynomial(params_2%2C%20points_2)%2C%20color%3D'green')%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20inlier_idx%2C%20outlier_idx%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%86%8D%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(inlier_idx%2C%20np%2C%20outlier_idx%2C%20plt%2C%20points_2%2C%20polynomial)%3A%0A%20%20%20%20_refined_params%20%3D%20np.polyfit(points_2%5Binlier_idx%2C%200%5D%2C%20points_2%5Binlier_idx%2C%201%5D%2C%201)%0A%20%20%20%20plt.scatter(points_2%5Binlier_idx%2C%200%5D%2C%20points_2%5Binlier_idx%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'orange')%0A%20%20%20%20plt.scatter(points_2%5Boutlier_idx%2C%200%5D%2C%20points_2%5Boutlier_idx%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'blue')%0A%20%20%20%20plt.plot(points_2%5B%3A%2C%200%5D%2C%20polynomial(_refined_params%2C%20points_2)%2C%20color%3D'green')%0A%20%20%20%20plt.plot(points_2%5B%3A%2C%200%5D%2C%20polynomial(_refined_params%2C%20points_2)%2C%20color%3D'red')%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%202%E6%AC%A1%E6%9B%B2%E7%B7%9A%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20plt)%3A%0A%20%20%20%20point_num_3%3A%20int%20%3D%201000%0A%20%20%20%20_errors%20%3D%20np.random.standard_cauchy(point_num_3)%0A%20%20%20%20x_4%20%3D%20np.linspace(0%2C%2010%2C%20point_num_3)%0A%20%20%20%20y_4%20%3D%20x_4%20**%202%20%2B%20_errors%20%2F%2010%0A%20%20%20%20points_3%20%3D%20np.vstack(%5Bx_4%2C%20y_4%5D).T%0A%20%20%20%20plt.scatter(x_4%2C%20y_4%2C%20s%3D0.5)%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20point_num_3%2C%20points_3%2C%20x_4%2C%20y_4%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20_e%20%3D%206%20%2F%2010%0A%20%20%20%20_n%20%3D%203%0A%20%20%20%20_p%20%3D%200.9999%0A%20%20%20%20max_iteration_1%20%3D%20int(np.log(1%20-%20_p)%20%2F%20_)%20if%20not%20np.isclose((_%20%3A%3D%20np.log(1%20-%20_e%20**%20_n))%2C%200)%20else%20100000.0%0A%20%20%20%20print(max_iteration_1)%0A%20%20%20%20return%20(max_iteration_1%2C)%0A%0A%0A%40app.cell%0Adef%20_(max_iteration_1%2C%20np%2C%20point_num_3%3A%20int%2C%20x_4%2C%20y_4)%3A%0A%20%20%20%20index_mat_1%20%3D%20np.random.randint(0%2C%20point_num_3%2C%20(max_iteration_1%2C%203))%0A%20%20%20%20samples_tensor_1%20%3D%20np.array(%5Bx_4%5Bindex_mat_1%5D%2C%20y_4%5Bindex_mat_1%5D%5D).transpose(1%2C%202%2C%200)%0A%20%20%20%20%23%20%E8%BB%A2%E7%BD%AE%E5%89%8D%E3%81%AE%E6%88%90%E5%88%86%E6%95%B0%E3%81%AF%20(axis%2C%20trials%2C%20points)%0A%20%20%20%20%23%20%E8%BB%A2%E7%BD%AE%E5%BE%8C%E3%81%AE%E6%88%90%E5%88%86%E6%95%B0%E3%81%AF%20(trials%2C%20points%2C%20axis)%0A%20%20%20%20print(samples_tensor_1.shape)%0A%20%20%20%20return%20(samples_tensor_1%2C)%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20samples_tensor_1)%3A%0A%20%20%20%20params_tensor_1%20%3D%20np.array(%5Bnp.polyfit(sample%5B%3A%2C%200%5D%2C%20sample%5B%3A%2C%201%5D%2C%202)%20for%20sample%20in%20samples_tensor_1%5D)%0A%20%20%20%20return%20(params_tensor_1%2C)%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20params_tensor_1%2C%20points_3)%3A%0A%20%20%20%20def%20_get_distances(params%2C%20points)%3A%0A%20%20%20%20%20%20%20%20y_est%20%3D%20params%5B0%5D%20*%20points%5B%3A%2C%200%5D%20**%202%20%2B%20params%5B1%5D%20*%20points%5B%3A%2C%200%5D%20%2B%20params%5B2%5D%0A%20%20%20%20%20%20%20%20distances%20%3D%20np.abs(points%5B%3A%2C%201%5D%20-%20y_est)%0A%20%20%20%20%20%20%20%20return%20distances%0A%20%20%20%20_distances_tensor%20%3D%20np.array(%5B_get_distances(params%2C%20points_3)%20for%20params%20in%20params_tensor_1%5D)%0A%20%20%20%20_distance_th%20%3D%200.3%0A%20%20%20%20inlier_bool_tensor_1%20%3D%20np.array(%5Bdistances%20%3C%20_distance_th%20for%20distances%20in%20_distances_tensor%5D)%0A%20%20%20%20_inlier_num_array%20%3D%20np.array(%5Bnp.sum(inlier_bool)%20for%20inlier_bool%20in%20inlier_bool_tensor_1%5D)%0A%20%20%20%20best_idx_1%20%3D%20np.argmax(_inlier_num_array)%0A%20%20%20%20print(best_idx_1)%0A%20%20%20%20return%20best_idx_1%2C%20inlier_bool_tensor_1%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20best_idx_1%2C%0A%20%20%20%20inlier_bool_tensor_1%2C%0A%20%20%20%20np%2C%0A%20%20%20%20params_tensor_1%2C%0A%20%20%20%20plt%2C%0A%20%20%20%20point_num_3%3A%20int%2C%0A%20%20%20%20points_3%2C%0A)%3A%0A%20%20%20%20params_3%20%3D%20params_tensor_1%5Bbest_idx_1%5D%0A%20%20%20%20inlier_idx_1%20%3D%20np.arange(point_num_3)%5Binlier_bool_tensor_1%5Bbest_idx_1%5D%5D%0A%20%20%20%20outlier_idx_1%20%3D%20np.arange(point_num_3)%5B~inlier_bool_tensor_1%5Bbest_idx_1%5D%5D%0A%20%20%20%20plt.scatter(points_3%5Binlier_idx_1%2C%200%5D%2C%20points_3%5Binlier_idx_1%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'orange')%0A%20%20%20%20plt.scatter(points_3%5Boutlier_idx_1%2C%200%5D%2C%20points_3%5Boutlier_idx_1%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'blue')%0A%20%20%20%20y_est%20%3D%20params_3%5B0%5D%20*%20points_3%5B%3A%2C%200%5D%20**%202%20%2B%20params_3%5B1%5D%20*%20points_3%5B%3A%2C%200%5D%20%2B%20params_3%5B2%5D%0A%20%20%20%20plt.plot(points_3%5B%3A%2C%200%5D%2C%20y_est%2C%20color%3D'green')%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20inlier_idx_1%2C%20outlier_idx_1%2C%20params_3%0A%0A%0A%40app.cell%0Adef%20_(inlier_idx_1%2C%20np%2C%20outlier_idx_1%2C%20params_3%2C%20plt%2C%20points_3%2C%20polynomial)%3A%0A%20%20%20%20_refined_params%20%3D%20np.polyfit(points_3%5Binlier_idx_1%2C%200%5D%2C%20points_3%5Binlier_idx_1%2C%201%5D%2C%202)%0A%20%20%20%20y_refined%20%3D%20_refined_params%5B0%5D%20*%20points_3%5B%3A%2C%200%5D%20**%202%20%2B%20_refined_params%5B1%5D%20*%20points_3%5B%3A%2C%200%5D%20%2B%20_refined_params%5B2%5D%0A%20%20%20%20plt.scatter(points_3%5Binlier_idx_1%2C%200%5D%2C%20points_3%5Binlier_idx_1%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'orange')%0A%20%20%20%20plt.scatter(points_3%5Boutlier_idx_1%2C%200%5D%2C%20points_3%5Boutlier_idx_1%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'blue')%0A%20%20%20%20plt.plot(points_3%5B%3A%2C%200%5D%2C%20polynomial(params_3%2C%20points_3)%2C%20color%3D'green')%0A%20%20%20%20plt.plot(points_3%5B%3A%2C%200%5D%2C%20y_refined%2C%20color%3D'red')%0A%20%20%20%20plt.xlim(0%2C%203.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20RANSAC%20(%E9%99%B0%E9%96%A2%E6%95%B0)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20%E5%86%86%E3%81%AE%E4%BE%8B%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%E3%82%92%E5%AE%9A%E7%BE%A9%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20def%20linear_basis(point)%3A%0A%20%20%20%20%20%20%20%20x%2C%20y%20%3D%20point%0A%20%20%20%20%20%20%20%20return%20%5Bx%2C%20y%2C%20x%20*%200%20%2B%201%5D%0A%0A%20%20%20%20def%20quad_basis(point)%3A%0A%20%20%20%20%20%20%20%20x%2C%20y%20%3D%20point%0A%20%20%20%20%20%20%20%20return%20%5Bx**2%2C%202*x*y%2C%20y**2%2C%202*x%2C%202*y%2C%20x%20*%200%20%2B%201%5D%0A%0A%20%20%20%20return%20linear_basis%2C%20quad_basis%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20plt)%3A%0A%20%20%20%20point_num_4%20%3D%20500%0A%20%20%20%20_errors%20%3D%200.02%20*%20np.random.normal(0%2C%201%2C%20(point_num_4%2C%202))%0A%20%20%20%20_theta%20%3D%20np.linspace(0%2C%202%20*%20np.pi%2C%20point_num_4)%0A%20%20%20%20x_5%20%3D%20np.cos(_theta)%20%2B%20_errors%5B%3A%2C%200%5D%0A%20%20%20%20y_5%20%3D%20np.sin(_theta)%20%2B%20_errors%5B%3A%2C%201%5D%0A%20%20%20%20points_4%20%3D%20np.vstack(%5Bx_5%2C%20y_5%5D).T%0A%20%20%20%20plt.scatter(points_4%5B%3A%2C%200%5D%2C%20points_4%5B%3A%2C%201%5D%2C%20s%3D0.5)%0A%20%20%20%20plt.axis('equal')%0A%20%20%20%20plt.xlim(-2%2C%202)%0A%20%20%20%20plt.ylim(-2%2C%202)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20(points_4%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%A7%8B%E9%80%A0%E8%A1%8C%E5%88%97%E3%81%AE%E8%A8%88%E7%AE%97%E4%BE%8B%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20plt%2C%20points_4%2C%20quad_basis)%3A%0A%20%20%20%20xi%20%3D%20quad_basis(points_4%5B20%5D)%0A%20%20%20%20mat%20%3D%20np.outer(xi%2C%20xi)%0A%20%20%20%20plt.imshow(mat)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E8%AA%A4%E5%B7%AE%E3%81%8C%E3%81%82%E3%82%8B%E7%B3%BB%E3%81%A0%E3%81%A8%E6%AD%A3%E5%AE%9A%E5%80%A4%E8%A1%8C%E5%88%97%E3%80%82%E8%AA%A4%E5%B7%AE%E3%81%8C%E3%81%AA%E3%81%84%E7%B3%BB%E3%81%A0%E3%81%A8%20det%3D0%20%E3%81%A7%E9%9D%9E%E8%B2%A0%E5%AE%9A%E5%80%A4%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20plt%2C%20points_4%2C%20quad_basis)%3A%0A%20%20%20%20xi_list%20%3D%20np.array(%5Bquad_basis(point)%20for%20point%20in%20points_4%5D)%0A%20%20%20%20structure_mat%20%3D%20np.mean(np.array(%5Bnp.outer(xi%2C%20xi)%20for%20xi%20in%20xi_list%5D)%2C%200)%0A%20%20%20%20plt.imshow(structure_mat)%0A%20%20%20%20print(f'det%3D%7Bnp.linalg.det(structure_mat)%7D')%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20np.linalg.cholesky(structure_mat)%0A%20%20%20%20except%20np.linalg.LinAlgError%20as%20error%3A%0A%20%20%20%20%20%20%20%20print(error)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20print('Matrix%20is%20positive%20definite')%0A%20%20%20%20e_value%2C%20e_vec%20%3D%20np.linalg.eig(structure_mat)%0A%20%20%20%20print(f'e_value%3D%7Be_value%7D')%0A%20%20%20%20params_4%20%3D%20e_vec%5B%3A%2C%20np.argmin(e_value)%5D%0A%20%20%20%20print(f'params%3D%7Bparams_4%7D')%0A%20%20%20%20return%20(params_4%2C)%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20params_4%2C%20plt%2C%20points_4%2C%20quad_basis)%3A%0A%20%20%20%20_diff%20%3D%200.01%0A%20%20%20%20_x_range%20%3D%20np.arange(np.min(points_4%5B%3A%2C%200%5D)%2C%20np.max(points_4%5B%3A%2C%200%5D)%2C%20_diff)%0A%20%20%20%20_y_range%20%3D%20np.arange(np.min(points_4%5B%3A%2C%201%5D)%2C%20np.max(points_4%5B%3A%2C%201%5D)%2C%20_diff)%0A%20%20%20%20X_1%2C%20Y_1%20%3D%20np.meshgrid(_x_range%2C%20_y_range)%0A%20%20%20%20basises%20%3D%20np.array(%5Bbasis%20*%20np.ones_like(X_1)%20for%20basis%20in%20quad_basis((X_1%2C%20Y_1))%5D)%0A%20%20%20%20Z_1%20%3D%20np.einsum('i%2Cijk-%3Ejk'%2C%20params_4%2C%20basises)%0A%20%20%20%20plt.imshow(Z_1)%0A%20%20%20%20plt.colorbar()%0A%20%20%20%20return%20X_1%2C%20Y_1%2C%20Z_1%0A%0A%0A%40app.cell%0Adef%20_(X_1%2C%20Y_1%2C%20Z_1%2C%20plt%2C%20points_4)%3A%0A%20%20%20%20plt.scatter(points_4%5B%3A%2C%200%5D%2C%20points_4%5B%3A%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'blue')%0A%20%20%20%20plt.contour(X_1%2C%20Y_1%2C%20Z_1%2C%20%5B0%5D%2C%20colors%3D'orange')%0A%20%20%20%20plt.axis('equal')%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20RANSAC%20%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E8%87%AA%E5%8B%95%E5%BE%AE%E5%88%86%E3%82%92%E5%AE%9F%E6%96%BD%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%20Jet%20%E3%82%92%E5%AE%9A%E7%BE%A9%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20quad_basis)%3A%0A%20%20%20%20class%20Jet%3A%0A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20a%3A%20float%2C%20v)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.a%20%3D%20a%0A%20%20%20%20%20%20%20%20%20%20%20%20self.v%20%3D%20np.array(v)%0A%0A%20%20%20%20%20%20%20%20def%20__str__(self)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20f'%7Bself.a%7D%2B%7Bself.v%7D'%0A%0A%20%20%20%20%20%20%20%20def%20__add__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20isinstance(other%2C%20(int%2C%20float))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20other%20%3D%20Jet(other%2C%20np.zeros(len(self.v)))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Jet(self.a%20%2B%20other.a%2C%20self.v%20%2B%20other.v)%0A%0A%20%20%20%20%20%20%20%20def%20__sub__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20isinstance(other%2C%20(int%2C%20float))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20other%20%3D%20Jet(other%2C%20np.zeros(len(self.v)))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Jet(self.a%20-%20other.a%2C%20self.v%20-%20other.v)%0A%0A%20%20%20%20%20%20%20%20def%20__mul__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20isinstance(other%2C%20(int%2C%20float))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20other%20%3D%20Jet(other%2C%20np.zeros(len(self.v)))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Jet(self.a%20*%20other.a%2C%20self.a%20*%20other.v%20%2B%20self.v%20*%20other.a)%0A%0A%20%20%20%20%20%20%20%20def%20__truediv__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20isinstance(other%2C%20(int%2C%20float))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20other%20%3D%20Jet(other%2C%20np.zeros(len(self.v)))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Jet(self.a%20%2F%20other.a%2C%20self.v%20%2F%20other.a%20-%20self.a%20*%20other.v%20%2F%20other.a%20**%202)%0A%0A%20%20%20%20%20%20%20%20def%20__pow__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20isinstance(other%2C%20(int%2C%20float))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20other%20%3D%20Jet(other%2C%20np.zeros(len(self.v)))%0A%20%20%20%20%20%20%20%20%20%20%20%20value%20%3D%20self.a%20**%20other.a%0A%20%20%20%20%20%20%20%20%20%20%20%20base_diff%20%3D%20other.a%20*%20self.a%20**%20(other.a%20-%201)%20*%20self.v%20%20%23%20%E5%BA%95%E3%81%8C0%2C%20%E8%B2%A0%E3%81%AE%E5%A0%B4%E5%90%88%E3%81%AB%E6%B3%A8%E6%84%8F%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20np.isclose(self.a%2C%200)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20exp_diff%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20exp_diff%20%3D%20value%20*%20other.v%20*%20np.log(np.abs(self.a))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Jet(value%2C%20base_diff%20%2B%20exp_diff)%0A%0A%20%20%20%20%20%20%20%20def%20__radd__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.__add__(other)%0A%0A%20%20%20%20%20%20%20%20def%20__rsub__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.__sub__(other)%0A%0A%20%20%20%20%20%20%20%20def%20__rmul__(self%2C%20other)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.__mul__(other)%0A%20%20%20%20x_6%20%3D%20Jet(1%2C%20(1%2C%200))%0A%20%20%20%20y_6%20%3D%20Jet(2%2C%20(0%2C%201))%0A%20%20%20%20print(quad_basis((x_6%2C%20y_6))%5B1%5D)%0A%20%20%20%20return%20(Jet%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%89%8D%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%BE%E3%81%A7%E3%81%AE%E5%87%A6%E7%90%86%E3%82%92%E8%B8%8F%E3%81%BE%E3%81%88%E3%81%A6%E3%80%81RANSAC%20%E3%82%92%E8%A1%8C%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Jet%2C%20np)%3A%0A%20%20%20%20import%20random%0A%20%20%20%20from%20typing%20import%20List%0A%0A%20%20%20%20import%20numpy.linalg%20as%20LA%0A%20%20%20%20from%20tqdm%20import%20tqdm%0A%0A%20%20%20%20class%20RANSAC%3A%0A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20basis_func%2C%20target_prob%3D0.9999)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.basis_func%20%3D%20basis_func%0A%20%20%20%20%20%20%20%20%20%20%20%20self.target_prob%20%3D%20target_prob%0A%0A%20%20%20%20%20%20%20%20def%20fit(self%2C%20points)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20xi_list%20%3D%20np.array(%5Bself.basis_func(point)%20for%20point%20in%20points%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20mat_list%20%3D%20np.array(%5Bnp.outer(xi%2C%20xi)%20for%20xi%20in%20xi_list%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20mat%20%3D%20np.mean(mat_list%2C%20axis%3D0)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20np.isclose(np.linalg.det(mat)%2C%200)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print('This%20fitting%20is%20statistics%20mode.')%0A%20%20%20%20%20%20%20%20%20%20%20%20e_value%2C%20e_vec%20%3D%20LA.eig(mat)%0A%20%20%20%20%20%20%20%20%20%20%20%20idx%20%3D%20np.argmin(e_value)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20(e_vec%5B%3A%2C%20idx%5D%2C%20e_value%5Bidx%5D%20*%20mat_list.shape%5B0%5D)%0A%0A%20%20%20%20%20%20%20%20def%20jet_basis(self%2C%20point%3A%20np.ndarray)%20-%3E%20List%5BJet%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22Jet%20%E5%9E%8B%E3%81%AE%E5%9F%BA%E5%BA%95%E9%96%A2%E6%95%B0%0A%20%20%20%20%20%20%23%20%E5%9B%BA%E6%9C%89%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AF%E5%88%97%E6%AF%8E%E3%81%AB%E6%A0%BC%E7%B4%8D%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB%E6%B3%A8%E6%84%8F%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20point%3A%20%E3%83%87%E3%83%BC%E3%82%BF%E5%80%A4(%E8%A6%8F%E6%A0%BC%E5%8C%96%E6%B8%88)%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Areturn%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20jets%20%3D%20%5BJet(point%5Bidx%5D%2C%20np.eye(len(point))%5Bidx%5D)%20for%20idx%20in%20range(len(point))%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20basis_list%20%3D%20self.basis_func(jets)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%5Bbasis%20%2B%20Jet(0%2C%20np.zeros_like(point))%20for%20basis%20in%20basis_list%5D%0A%0A%20%20%20%20%20%20%20%20def%20get_cov_mat(self%2C%20point%3A%20np.ndarray)%20-%3E%20np.ndarray%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%E6%AD%A3%E8%A6%8F%E5%8C%96%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20point%3A%20%E3%83%87%E3%83%BC%E3%82%BF%E5%80%A4(%E8%A6%8F%E6%A0%BC%E5%8C%96%E6%B8%88)%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Areturn%3A%20%E6%AD%A3%E8%A6%8F%E5%8C%96%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20xi%20%3D%20self.jet_basis(point)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20np.array(%5B%5Bnp.dot(xi%5Bi%5D.v%2C%20xi%5Bj%5D.v)%20for%20j%20in%20range(len(xi))%5D%20for%20i%20in%20range(len(xi))%5D)%0A%0A%20%20%20%20%20%20%20%20def%20sampson_error(self%2C%20point%3A%20np.ndarray%2C%20params%3A%20np.ndarray)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_cov_mat%20%3D%20self.get_cov_mat(point)%0A%20%20%20%20%20%20%20%20%20%20%20%20denominator%20%3D%20np.dot(params%2C%20_cov_mat%20%40%20params)%0A%20%20%20%20%20%20%20%20%20%20%20%20xi%20%3D%20self.basis_func(point)%0A%20%20%20%20%20%20%20%20%20%20%20%20numerator%20%3D%20np.dot(xi%2C%20params)%20**%202%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20numerator%20%2F%20denominator%20if%20not%20np.isclose(denominator%2C%200)%20else%20np.inf%0A%0A%20%20%20%20%20%20%20%20def%20criteria(self%2C%20inlier_prob%3A%20float%2C%20degree%3A%20int)%20-%3E%20int%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22RANSAC%20%E3%81%AE%E7%B5%82%E4%BA%86%E6%9D%A1%E4%BB%B6%E3%82%92%E8%A8%88%E7%AE%97%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20inlier_prob%3A%20inlier%20%E3%81%AE%E5%89%B2%E5%90%88%2F%E7%A2%BA%E7%8E%87%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Aparam%20degree%3A%20%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E6%AC%A1%E6%95%B0%2F%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E6%95%B0%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Areturn%3A%20RANSAC%20%E3%81%AE%E5%8F%8D%E5%BE%A9%E5%9B%9E%E6%95%B0%E3%81%AE%E7%9B%AE%E5%AE%89%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20int(np.log(1%20-%20self.target_prob)%20%2F%20_)%20if%20not%20np.isclose((_%20%3A%3D%20np.log(1%20-%20inlier_prob%20**%20degree))%2C%200)%20else%20100000.0%0A%0A%20%20%20%20%20%20%20%20def%20execute(self%2C%20points%2C%20distance_th%3D0.1)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20data_num%20%3D%20points.shape%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20degree%20%3D%20len(self.basis_func(points%5B0%2C%20%3A%5D))%20-%201%0A%20%20%20%20%20%20%20%20%20%20%20%20inlier_prob%20%3D%200.1%0A%20%20%20%20%20%20%20%20%20%20%20%20max_iteration%20%3D%20self.criteria(inlier_prob%2C%20degree)%0A%20%20%20%20%20%20%20%20%20%20%20%20iteration%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20best_inlier_bool%20%3D%20%5BFalse%20for%20_%20in%20range(data_num)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20best_inlier_num%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20best_params%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20with%20tqdm(total%3Dmax_iteration)%20as%20pbar%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20while%20iteration%20%3C%20max_iteration%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rand_idx%20%3D%20random.sample(range(data_num)%2C%20degree)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20params%2C%20_%20%3D%20self.fit(points%5Brand_idx%2C%20%3A%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20distance_sq%20%3D%20np.array(%5Bself.sampson_error(point%2C%20params)%20for%20point%20in%20points%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlier_bool%20%3D%20distance_sq%20%3C%20distance_th%20**%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inlier_num%20%3D%20np.sum(inlier_bool)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20iteration%20%3D%20iteration%20%2B%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pbar.update(1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20inlier_num%20%3E%20best_inlier_num%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_iteration%20%3D%20min(max_iteration%2C%20self.criteria(inlier_num%20%2F%20data_num%2C%20degree))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_inlier_bool%20%3D%20inlier_bool%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_inlier_num%20%3D%20inlier_num%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20best_params%20%3D%20params%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pbar.total%20%3D%20max_iteration%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pbar.refresh()%0A%20%20%20%20%20%20%20%20%20%20%20%20best_params%2C%20loss%20%3D%20self.fit(points%5Bbest_inlier_bool%2C%20%3A%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f'params%3D%7Bbest_params%7D')%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f'fitness%3D%7Bbest_inlier_num%20%2F%20data_num%7D')%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20(best_params%2C%20best_inlier_bool%2C%20loss)%0A%0A%20%20%20%20return%20(RANSAC%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20%E7%B7%9A%E5%BD%A2%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AE%9F%E8%A3%85%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E5%86%8D%E5%BA%A6%E7%B7%9A%E5%BD%A2%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E5%AE%9F%E6%96%BD%E3%80%82%0A%20%20%20%20%E4%B8%8A%E3%81%A8%E5%90%8C%E6%A7%98%E3%81%AB%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%94%9F%E6%88%90%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20plt)%3A%0A%20%20%20%20point_num_5%3A%20int%20%3D%201000%0A%20%20%20%20_errors%20%3D%20np.random.standard_cauchy(point_num_5)%0A%20%20%20%20x_7%20%3D%20np.linspace(0%2C%2010%2C%20point_num_5)%0A%20%20%20%20y_7%20%3D%20x_7%20%2B%20_errors%20%2F%2010%0A%20%20%20%20points_5%20%3D%20np.vstack(%5Bx_7%2C%20y_7%5D).T%0A%20%20%20%20plt.scatter(x_7%2C%20y_7%2C%20s%3D0.5)%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20point_num_5%2C%20points_5%0A%0A%0A%40app.cell%0Adef%20_(RANSAC%2C%20linear_basis%2C%20points_5)%3A%0A%20%20%20%20linear_estimator%20%3D%20RANSAC(linear_basis)%0A%20%20%20%20params_5%2C%20inlier_bools%2C%20loss%20%3D%20linear_estimator.execute(points_5%2C%20distance_th%3D0.3)%0A%20%20%20%20return%20inlier_bools%2C%20params_5%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E9%99%B0%E9%96%A2%E6%95%B0%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC%E9%96%A2%E6%95%B0%E3%82%92%E5%AE%9A%E7%BE%A9%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20def%20get_contour(basis_func%2C%20points%2C%20params%2C%20diff)%3A%0A%20%20%20%20%20%20%20%20_x_range%20%3D%20np.arange(np.min(points%5B%3A%2C%200%5D)%2C%20np.max(points%5B%3A%2C%200%5D)%2C%20diff)%20%20%23%20%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E7%94%9F%E6%88%90%0A%20%20%20%20%20%20%20%20_y_range%20%3D%20np.arange(np.min(points%5B%3A%2C%201%5D)%2C%20np.max(points%5B%3A%2C%201%5D)%2C%20diff)%0A%20%20%20%20%20%20%20%20x_mesh%2C%20y_mesh%20%3D%20np.meshgrid(_x_range%2C%20_y_range)%0A%20%20%20%20%20%20%20%20basises%20%3D%20np.array(%5Bbasis%20*%20np.ones_like(x_mesh)%20for%20basis%20in%20basis_func((x_mesh%2C%20y_mesh))%5D)%0A%20%20%20%20%20%20%20%20z_mesh%20%3D%20np.einsum('i%2Cijk-%3Ejk'%2C%20params%2C%20basises)%0A%20%20%20%20%20%20%20%20return%20(x_mesh%2C%20y_mesh%2C%20z_mesh)%0A%0A%20%20%20%20return%20(get_contour%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E7%B5%90%E6%9E%9C%E3%82%92%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20get_contour%2C%0A%20%20%20%20inlier_bools%2C%0A%20%20%20%20linear_basis%2C%0A%20%20%20%20np%2C%0A%20%20%20%20params_5%2C%0A%20%20%20%20plt%2C%0A%20%20%20%20point_num_5%3A%20int%2C%0A%20%20%20%20points_5%2C%0A)%3A%0A%20%20%20%20inlier_idx_2%20%3D%20np.arange(point_num_5)%5Binlier_bools%5D%0A%20%20%20%20outlier_idx_2%20%3D%20np.arange(point_num_5)%5B~inlier_bools%5D%0A%20%20%20%20plt.scatter(points_5%5Boutlier_idx_2%2C%200%5D%2C%20points_5%5Boutlier_idx_2%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'blue')%0A%20%20%20%20plt.scatter(points_5%5Binlier_idx_2%2C%200%5D%2C%20points_5%5Binlier_idx_2%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'orange')%0A%20%20%20%20plt.contour(*get_contour(linear_basis%2C%20points_5%2C%20params_5%2C%200.01)%2C%20%5B0%5D%2C%20colors%3D'green')%0A%20%20%20%20plt.ylim(-1%2C%2011)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%202%E6%AC%A1%E6%9B%B2%E7%B7%9A%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%E7%94%9F%E6%88%90%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20plt)%3A%0A%20%20%20%20_center%20%3D%20np.array(%5B1%2C%202%5D)%0A%20%20%20%20scales%20%3D%20np.array(%5B2%2C%203%5D)%0A%20%20%20%20rad%20%3D%20np.deg2rad(-30)%0A%20%20%20%20point_num_6%20%3D%20500%0A%20%20%20%20_errors%20%3D%200.01%20*%20np.random.standard_cauchy((point_num_6%2C%202))%0A%20%20%20%20_theta%20%3D%20np.linspace(0%2C%202%20*%20np.pi%2C%20point_num_6)%0A%20%20%20%20x_8%20%3D%20_center%5B0%5D%20%2B%20scales%5B0%5D%20*%20np.cos(_theta)%20%2B%20_errors%5B%3A%2C%200%5D%0A%20%20%20%20y_8%20%3D%20_center%5B1%5D%20%2B%20scales%5B1%5D%20*%20np.sin(_theta)%20%2B%20_errors%5B%3A%2C%201%5D%0A%20%20%20%20points_6%20%3D%20np.vstack(%5Bx_8%2C%20y_8%5D).T%0A%20%20%20%20rot_mat%20%3D%20np.array(%5B%5Bnp.cos(rad)%2C%20-np.sin(rad)%5D%2C%20%5Bnp.sin(rad)%2C%20np.cos(rad)%5D%5D)%0A%20%20%20%20points_6%20%3D%20points_6%20%40%20rot_mat%0A%20%20%20%20plt.scatter(points_6%5B%3A%2C%200%5D%2C%20points_6%5B%3A%2C%201%5D%2C%20s%3D0.5)%0A%20%20%20%20plt.xlim((-3%2C%203))%0A%20%20%20%20plt.ylim((-2%2C%206))%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20point_num_6%2C%20points_6%0A%0A%0A%40app.cell%0Adef%20_(RANSAC%2C%20points_6%2C%20quad_basis)%3A%0A%20%20%20%20quad_estimator%20%3D%20RANSAC(quad_basis)%0A%20%20%20%20params_6%2C%20inlier_bools_1%2C%20loss_1%20%3D%20quad_estimator.execute(points_6%2C%20distance_th%3D0.07)%0A%20%20%20%20return%20inlier_bools_1%2C%20loss_1%2C%20params_6%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20get_contour%2C%0A%20%20%20%20inlier_bools_1%2C%0A%20%20%20%20np%2C%0A%20%20%20%20params_6%2C%0A%20%20%20%20plt%2C%0A%20%20%20%20point_num_6%2C%0A%20%20%20%20points_6%2C%0A%20%20%20%20quad_basis%2C%0A)%3A%0A%20%20%20%20inlier_idx_3%20%3D%20np.arange(point_num_6)%5Binlier_bools_1%5D%0A%20%20%20%20outlier_idx_3%20%3D%20np.arange(point_num_6)%5B~inlier_bools_1%5D%0A%20%20%20%20plt.scatter(points_6%5Boutlier_idx_3%2C%200%5D%2C%20points_6%5Boutlier_idx_3%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'blue')%0A%20%20%20%20plt.scatter(points_6%5Binlier_idx_3%2C%200%5D%2C%20points_6%5Binlier_idx_3%2C%201%5D%2C%20s%3D0.5%2C%20color%3D'orange')%0A%20%20%20%20plt.contour(*get_contour(quad_basis%2C%20points_6%2C%20params_6%2C%200.01)%2C%20%5B0%5D%2C%20colors%3D'green')%0A%20%20%20%20plt.xlim((-3%2C%203))%0A%20%20%20%20plt.ylim((-2%2C%206))%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20(inlier_idx_3%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E8%AA%A4%E5%B7%AE%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97%0A%20%20%20%20%24%24%0A%20%20%20%20V%5Cequiv%20E%5B%5Cdelta%20a%5ET%5Cdelta%20a%5D%0A%20%20%20%20%3D%5Cfrac%7B%5Cchi%5E2%7D%7Bn-m%7D(X%5ETX)%5E%7B-1%7D%0A%20%20%20%20%24%24%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(inlier_bools_1%2C%20inlier_idx_3%2C%20loss_1%2C%20np%2C%20plt%2C%20points_6%2C%20quad_basis)%3A%0A%20%20%20%20basis_list%20%3D%20np.array(%5Bquad_basis(point)%20for%20point%20in%20points_6%5Binlier_idx_3%2C%20%3A%5D%5D)%0A%20%20%20%20variance%20%3D%20loss_1%20%2F%20(np.sum(inlier_bools_1)%20-%20basis_list.shape%5B1%5D)%0A%20%20%20%20param_cov%20%3D%20np.linalg.inv(basis_list.T%20%40%20basis_list)%20*%20variance%0A%20%20%20%20plt.imshow(param_cov)%0A%20%20%20%20return%20(param_cov%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%2F%2F%20TODO%3A%20%E5%87%BA%E5%8A%9B%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%8C%E3%81%8A%E3%81%8B%E3%81%97%E3%81%84(%E5%B0%8F%E3%81%95%E3%81%99%E3%81%8E%E3%82%8B%E3%83%BB%E8%87%AA%E6%98%8E%E3%81%AA%E8%A7%A3%3F)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(inlier_idx_3%2C%20np%2C%20odr%2C%20plt%2C%20points_6%2C%20quad_basis)%3A%0A%20%20%20%20_model%20%3D%20odr.Model(lambda%20beta%2C%20x%3A%20np.dot(beta%2C%20quad_basis(x))%2C%20implicit%3DTrue)%0A%20%20%20%20_data%20%3D%20odr.Data(points_6%5Binlier_idx_3%2C%20%3A%5D.T%2C%20y%3D1)%0A%20%20%20%20_solver%20%3D%20odr.ODR(_data%2C%20_model%2C%20beta0%3D%5B1%20%2F%206%2C%201%20%2F%206%2C%201%20%2F%206%2C%201%20%2F%206%2C%201%20%2F%206%2C%201%20%2F%206%5D)%0A%20%20%20%20result_2%20%3D%20_solver.run()%0A%20%20%20%20result_2.pprint()%0A%20%20%20%20plt.imshow(result_2.cov_beta)%0A%20%20%20%20return%20(result_2%2C)%0A%0A%0A%40app.cell%0Adef%20_(param_cov%2C%20result_2)%3A%0A%20%20%20%20print(param_cov%20%2F%20result_2.cov_beta)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
37514cedef0c7fa1ae613060443677d3