首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不含numpy聚类的python二次函数的拟合

不含numpy聚类的python二次函数的拟合
EN

Stack Overflow用户
提问于 2019-05-17 07:34:14
回答 1查看 5.8K关注 0票数 7

我试图将二次函数拟合到一些数据中,并且我试图在不使用numpy的多拟合函数的情况下做到这一点。

从数学上讲,我试图跟踪这个网站https://neutrium.net/mathematics/least-squares-fitting-of-a-polynomial/,但不知何故,我认为我做得不对。如果有人能帮助我,那将是很棒的,或者如果你可以建议另一种方法来做,那也将是很棒的。

到目前为止我尝试过的是:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

ones = np.ones(3)
A = np.array( ((0,1),(1,1),(2,1)))
xfeature = A.T[0]
squaredfeature = A.T[0] ** 2
b = np.array( (1,2,0), ndmin=2 ).T
b = b.reshape(3)

features = np.concatenate((np.vstack(ones), np.vstack(xfeature), np.vstack(squaredfeature)), axis = 1)
featuresc = features.copy()
print(features)
m_det = np.linalg.det(features)
print(m_det)
determinants = []
for i in range(3):
    featuresc.T[i] = b
    print(featuresc)
    det = np.linalg.det(featuresc)
    determinants.append(det)
    print(det)
    featuresc = features.copy()

determinants = determinants / m_det
print(determinants)
plt.scatter(A.T[0],b)
u = np.linspace(0,3,100)
plt.plot(u, u**2*determinants[2] + u*determinants[1] + determinants[0] )
p2 = np.polyfit(A.T[0],b,2)
plt.plot(u, np.polyval(p2,u), 'b--')
plt.show()

正如你所看到的,我的曲线与nnumpy的多重拟合曲线相比不太好。

更新:我检查了我的代码,删除了所有愚蠢的错误,现在它起作用了,当我试图超过3分的时候,但是我不知道如何超过3分。

这是新代码:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

ones = np.ones(3)
A = np.array( ((0,1),(1,1),(2,1)))
xfeature = A.T[0]
squaredfeature = A.T[0] ** 2
b = np.array( (1,2,0), ndmin=2 ).T
b = b.reshape(3)

features = np.concatenate((np.vstack(ones), np.vstack(xfeature), np.vstack(squaredfeature)), axis = 1)
featuresc = features.copy()
print(features)
m_det = np.linalg.det(features)
print(m_det)
determinants = []
for i in range(3):
    featuresc.T[i] = b
    print(featuresc)
    det = np.linalg.det(featuresc)
    determinants.append(det)
    print(det)
    featuresc = features.copy()

determinants = determinants / m_det
print(determinants)
plt.scatter(A.T[0],b)
u = np.linspace(0,3,100)
plt.plot(u, u**2*determinants[2] + u*determinants[1] + determinants[0] )
p2 = np.polyfit(A.T[0],b,2)
plt.plot(u, np.polyval(p2,u), 'r--')
plt.show()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-17 07:48:06

相反,使用Cramer法则,实际上是用最小二乘法来求解系统。请记住,Cramer法则只有当你拥有的点数总数等于多项式加1的期望阶数时才能起作用。如果你没有它,那么Cramer规则就不会起作用,因为你在试图找到这个问题的精确解。如果你有更多的点,这个方法是不合适的,因为我们会创建一个过度确定的方程组。

为了适应更多的点,numpy.linalg.lstsq会更适合,因为它通过计算使用矩阵A最小化欧氏范数的向量x来解决Ax =b的问题,因此,从特征矩阵的最后一列中删除y值,并对系数进行求解,并使用numpy.linalg.lstsq求解系数:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt


ones = np.ones(4)
xfeature = np.asarray([0,1,2,3])
squaredfeature = xfeature ** 2
b = np.asarray([1,2,0,3])

features = np.concatenate((np.vstack(ones),np.vstack(xfeature),np.vstack(squaredfeature)), axis = 1) # Change - remove the y values

determinants = np.linalg.lstsq(features, b)[0] # Change - use least squares
plt.scatter(xfeature,b)
u = np.linspace(0,3,100)
plt.plot(u, u**2*determinants[2] + u*determinants[1] + determinants[0] )
plt.show()

我现在得到了这幅图,它与图中虚线的内容相匹配,也与numpy.polyfit提供的内容相匹配:

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56181712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档