擬合線性函式的幾種方法

2021-10-12 10:20:55 字數 4458 閱讀 8946

a

= np.

vander

(x,2

) #生成矩陣(資料,輸出列數)

c= np.

diag

(yerr * yerr)

ata= np.

dot(a.

t,a/

(yerr **2)

[:, none]

) #獲取乘積

cov = np.linalg.

inv(

ata)

w = np.linalg.

solve

(ata

, np.

dot(a.

t, y / yerr **2)

)

np.diag(array) 中,array是乙個1維陣列時,結果形成乙個以一維陣列為對角線元素的矩陣,array是乙個二維矩陣時,結果輸出矩陣的對角線元素。

np.linalg.inv():矩陣求逆

numpy.linalg.solve(a, b)以矩陣形式解乙個線性矩陣方程,或線性標量方程組。a為係數矩陣,b為縱座標或引數值

其中y為y的列矩陣

a為x的二維矩陣(結構解釋在之後)

c為方差的對角矩陣

設[m b]t =x

則 ax=y,即 mx+b=y

atc-1ax=atc-1y

所以 x=[atc-1a]-1 atc-1y

**中的ata即atc-1a

詳情參考:

def fund

(x,a,b)

: b=

-b i=np.

log10

(x+a)

n=b*i

return nx=[

]x = np.

array

(x)y =

#使y變為陣列格式

y = np.

array

(y)#求lgy

#y=np.

log10

(y)

#y的誤差

yerr =

yerr = np.

array

(yerr)

#求lgyerr

#yerr=np.

log10

(yerr)

#擬合函式,其中popt是引數結果集,pcov是方差集,curve_fit引數中,found是目標函式格式,sigma是y的誤差值

popt, pcov =

curve_fit

(fund, x, y,sigma=yerr)

#y2為求出擬合函式**的y值,方便畫圖對比評估擬合效果

y2 =

[fund

(i,popt[0]

,popt[1]

)for i in x]

plt.

axes

(yscale =

"log"

)plt.

axes

(xscale =

"log"

)plt.

loglog

(x, y1,

"k", marker=

'.')

plt.

loglog

(x, y3,

"g",

'r--'

)plt.

show()

print

(popt)

print

(pcov)

缺點:無法求出具體引數值

x=

x = np.

array

(x)y =

y = np.

log10

(np.

array

(y))

x= np.

reshape

(x,(25,

1))y

= np.

reshape

(y,(25,

1))with tf.

name_scope

('input'):

xin = tf.

placeholder

('float'

, shape=

[none,1]

) yin = tf.

placeholder

('float'

, shape=

[none,1]

)with tf.

name_scope

('layer'):

w1= tf.

variable

(tf.

random_normal([

1,4]

, mean=

1, stddev=

0.2)

, name=

'w1'

) b1 = tf.

variable

(tf.

constant

(0.1

, shape=[4

], dtype=tf.float32)

, name=

'b1'

) out1 = tf.nn.

sigmoid

(tf.

add(tf.

matmul

(xin,w1)

, b1)

)with tf.

name_scope

('output'):

w2= tf.

variable

(tf.

random_normal([

4,1]

, mean=

1, stddev=

0.2)

, name=

'w2'

) b2 = tf.

variable

(tf.

constant

(0.1

, shape=[1

], dtype=tf.float32)

, name=

'b2'

) out2 = tf.

add(tf.

matmul

(out1,w2)

, b2)

with tf.

name_scope

('evaluate'):

loss = tf.

reduce_mean

(tf.

square

(out2 - yin)

) trainstep = tf.train.

gradientdescentoptimizer

(0.1).

minimize

(loss)

# %% train

with tf.

session()

as sess:

step =

0 sess.

run(tf.

global_variables_initializer()

)while step <

5000

: tstep = sess.

run(trainstep, feed_dict=

)if step %3==

0:loss = sess.

run(loss, feed_dict=

)print

('train step: '

, tstep)

print

('loss: '

, loss)

step +=

1 # print

(sess.

run(w1)

) # print

(sess.

run(b1)

) # print

(sess.

run(w2)

) # print

(sess.

run(b2)

) # test

y_= sess.

run(out2, feed_dict=

) # print

(sess.

run(feed_dict=))

plt.

plot(x

,y,x

,y_)plt.

show

()

線性擬合函式

線性擬合函式 regress 呼叫格式 b regress y,x b,bint,r,rint,stats regress y,x b,bint,r,rint,stats regress y,x,alpha 該函式求解線性模型 y x 是p 1的引數向量 是服從標準正態分佈的隨機干擾的n 1的向量 ...

polyfit線性擬合函式

polyfit函式是matlab中用於進行曲線擬合的乙個函式。其數學基礎是最小二乘法曲線擬合原理。曲線擬合 已知離散點上的資料集,即已知在點集上的函式值,構造乙個解析函式 其圖形為一曲線 使在原離散點上盡可能接近給定的值。呼叫方法 polyfit x,y,n 用多項式求過已知點的表示式,其中x為源資...

scala函式定義的幾種方法

scala看了有幾天了,也試著寫了 hello world 今天試著練習伴生物件的時候,突然搞不明白scala伴生物件中定義的函式,並不能按我的想法工作。scala真是個非常靈活的語言,這裡還是總結下函式定義的幾種情況吧。1 規規矩矩的寫法,帶有等號 大括號和返回值型別的形式 def myfunc ...