一元二次方程的拟合,怎么分段拟合?
人工智能吧
全部回复
仅看楼主
level 6
记得在某个文章中看到在进行非线性拟合时候,比如一元二次函数,可以分三段直线拟合,这个是怎么做到的?有类似的文章推荐一下吗?
2021年11月19日 08点11分 1
level 12
在确定了二次曲线及曲线的最小最大x后,可是可以三条直线段拟合(近似),先假定一组足够细粒度均匀划分最小最大x的X,可用X=np.linspace(xmin,xmax,100000)生成,X可分成可变长度三部分但中间各部分位置数整数连续,会有不同斜率和截距共三条直线,三条直线的交点近似可求,由各直线斜率和截距确定,所以不需要将交点坐标作为参数出现,只需要将斜率和截距6参数作未知进行优化求解就可以了,列出mse损失值,求解最优就行,必能找到任意二次曲线段的三直线段最佳拟合。
2021年11月19日 12点11分 4
列出来的是方程组,所以要用方程组的参数最优化求解方法。有些书上有介绍,记不得哪本书了,可参考拉格朗日乘子法的资料。
2021年11月19日 12点11分
如果求必须与曲线相切,也是可以的,会增加三个条件方程到方程组,最后仍可化简成三个方程。相切是有实际工程意义的,例如下料算法,尽量少浪费材料,就用得上了。
2021年11月19日 12点11分
内接也有用,但工程上对于内接,情愿用曲线下料工具,否则应力可能导致工件在线与线交点严重变形或破坏。
2021年11月19日 12点11分
大佬有代码可以参考一下吗
2021年11月19日 12点11分
level 12
2021年11月19日 14点11分 5
呃,先数错了,是4段拟合了,如果设定最大迭代次数多训练,估计能成三段的
2021年11月19日 14点11分
要训练出3段的,你自己去尝试吧,下面我把代码写上来
2021年11月19日 14点11分
level 12
先导入一些包包括神经网络工具包,并随便生成一条曲线
import numpy as np,matplotlib.pyplot as plt
from sklearn import neural_network
x=np.linspace(-5,5,10000)
y=0.2*x**2+0.1*x+0.1
plt.plot(x,y)
plt.show()
运行上面代码后可以看到是一条二次曲线,再接着建个神经网络模型
myreg=neural_network.MLPRegressor()
myreg.hidden_layer_sizes=5
x=x.reshape(-1,1)
myreg.fit(x,y)
y_predict=myreg.predict(x)
plt.plot(x,y,'r')
plt.plot(x,y_predict,'b')
plt.show()
运行结果自己去试,你还可以试试myreg.activation='leakrelu',但这个不支持
2021年11月19日 14点11分 6
level 12
这回这个是三段的了,仍是原来的代码,但每次训练,因为参数随机初始化的不同,训练结果就不同,这次只有两个神经元在起作用了。
2021年11月19日 15点11分 7
所以,如果想拟合得看起来很圆润的曲线,就得多加神经元,最好是myreg.hidden_layer_sizes=(200,200),这样有两个隐层,每层都有两百个神经元,甚至中间可以再加一层,但这样训练会变得很慢,本来一秒不到,可能要训练几十分钟了。
2021年11月19日 15点11分
那本书的全名是python神经网络编程,英国人写的。
2021年11月19日 15点11分
@胡梦柯5 收获颇丰,我思考下
2021年11月20日 02点11分
@胡梦柯5 感谢大佬
2021年11月20日 02点11分
1