初學機器學習,看到書中講線性擬合,便試著用python程式設計實現。所要擬合的函式為: f(
x)=sin(x
)+ξ,
x∈(0
,20) f(x
)=sin(x
)+ξ,
x∈(0
,20)其中,
ξ ξ
服從均差為0.3的高斯分布。
實現**如下:
import numpy as np
import matplotlib.pyplot as plt
import math
class
polynomialfitting
(object):
def__init__
(self,degree=5,scale=50):
self.degree=degree
self.scale=scale
# 生成特徵矩陣x
defgeneratingx
(self):
self.x=np.arange(0,20,20/self.scale)
self.x=np.ones((self.scale,self.degree+1))
for i in range(self.scale):
for j in range(self.degree+1):
self.x[i,j]=math.pow(self.x[i],j)
# 生成矩陣y
defgeneratingy
(self):
self.y=np.sin(self.x)+np.random.normal(scale=0.1,size=len(self.x))
self.y=self.y.reshape(self.scale,1)
# 求係數a
defgeneratinga
(self):
self.a=np.linalg.inv(np.dot(self.x.t,self.x)).dot(self.x.t).dot(self.y)
print("係數矩陣為:")
print(self.a)
# 測試
deftest
(self):
plt.plot(self.x,self.x.dot(self.a),'r')
plt.plot(self.x,self.y,'g.')
plt.title("degree="+str(self.degree))
plt.show()
defmain
(): p=polynomialfitting(degree=25,scale=1000)
p.generatingx()
p.generatingy()
p.generatinga()
p.test()
if __name__=="__main__":
main()
多次改變次數degree,所得結果如下(其中綠點為資料點,紅線為擬合曲線):
可以看出,次數為15次時效果最好。在多項式擬合中,並不是次數越高擬合效果越好。
多項式擬合缺點 多項式擬合
在網上看別人的心得 一 最小二乘法的基本原理 從整體上考慮近似函式同所給資料點 i 0,1,m 誤差 i 0,1,m 的大小,常用的方法有以下三種 一是誤差 i 0,1,m 絕對值的最大值,即誤差 向量的 範數 二是誤差絕對值的和,即誤差向量r的1 範數 三是誤差平方和的算術平方根,即誤差向量r的2...
多項式擬合
class1.cs 擬合類 using system using system.collections.generic using system.text namespace 最小二乘法擬合多項式 guass i,j sumarr arrx,i,arry,1,length return comput...
多項式擬合
多項式擬合 多項式的一般形式 y p x n p x p x p x p 多項式擬合的目的是為了找到一組p0 pn,使得擬合方程盡可能的與實際樣本資料相符合。假設擬合得到的多項式如下 f x p x n p x p x p x p 則擬合函式與真實結果的差方如下 loss y 1 f x 1 2 y...