)# 對每個點代入公式求和
for i in
range(0
,len
(data)):
x = data[i,0]
y = data[i,1]
tmp = w_current * x + b_current - y
b_sum += tmp
w_sum += tmp * x
# 用公式求當前梯度
grad_w =
2/ m * w_sum
grad_b =
2/ m * b_sum
# 梯度下降,更新當前的w和b
b_new = b_current - alpha * grad_b
w_new = w_current - alpha * grad_w
return
[b_new, w_new]
defgradient_descent
(data, b_start, w_start, alpha, num_iterations)
: b = b_start
w = w_start
# 儲存所有的損失函式值,用來顯示下降過程
cost_list=
for i in
range
(num_iterations):)
b_new, w_new = step_gradient(b, w, data, alpha)
b = b_new
w = w_new
return
[b, w, cost_list]
# create data
b_start =
1w_start =
1alpha =
float
(input
("步長:"))
num_iterations =
int(
input
("迭代次數:"))
data =[[
0.0,0]
,[0.9,10]
,[1.9,30]
,[3.0,50]
,[3.9,80]
,[5.0,
110]
]data = np.array(data)
x = data[:,
0]y = data[:,
1]# train
b_now, w_now, cost_list = gradient_descent(data, b_start, w_start, alpha, num_iterations)
("w is :"
, w_now)
("b is :"
, b_now)
("運動方程s=%f*t+(%f)"
%(w_now, b_now)
)# 精確值
p = np.polyfit(x, y, deg=1)
("參考係數:"
, p)
# plot
plt.scatter(x, y)
ori_y = x * w_start + b_start
plt.plot(x, ori_y, color=
"green"
, label=
"origin"
)pre_y = w_now * x + b_now
plt.plot(x, pre_y, color=
"red"
, label=
"fit"
)plt.xlabel(
"x")
plt.ylabel(
"y")
plt.legend(
)plt.figure(
)cost = cost_function(w_now, b_now, data)
# print("cost_list:", cost_list)
("cost is:"
, cost)
plt.plot(cost_list)
plt.show(
)
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
# 原始散點座標
x =[70,
100,
120,
150,
180,
200]
y =[
0.95
,0.85
,0.5
,0.2
,0.05,0
]xd = np.array([70
,100
,120
,150
,180])
yd = np.log(np.array(
[0.95
,0.85
,0.5
,0.2
,0.05])
)# 表示式
deffunc
(x, d, n)
:return
- np.power(x / d, n)
# 非線性最小二乘擬合
popt, pcov = curve_fit(func, xd, yd)
# 獲取popt裡的擬合係數
d = popt[0]
n = popt[1]
# 擬合yd的值
yvals = np.exp(func(x, d, n)
)print
("d:"
, d)
print
("n:"
, n)
# 繪圖
plt.figure(
)plt.plot(x, y,
'd', label=
"original values"
)xx = np.linspace(70,
200,50)
y_vals = np.exp(func(xx, d, n)
)plt.plot(xx, y_vals,
'r', label=
"$fit: y_d = e^)^}$"
%tuple
(popt)
)plt.xlabel(
"diameter"
)plt.ylabel(
"mass fraction"
)plt.legend(loc=1)
# 圖例位置
plt.show(
)
MATLAB 離散點的圓弧擬合
最近做專案,會遇到很多資料擬合的問題,通常在網上搜尋時會看到很多 乙個個嘗試有對有錯,下面根據專案進展情況總結一下用到的相關知識。都是由本人親測,雖然簡單但是絕對正確的 首先是圓弧擬合的 由離散點擬合 t1為二維矩陣,t1的第一行為x軸的資料點,t1的第二行為y軸的資料點,用 表示為 t1 1,x,...
matlab進行離散點的曲線擬合
ployfit是matlab中基於最小二乘法的多項式擬合函式。最基礎的用法如下 c polyfit x,y,n 其中 x 需要擬合的點的橫座標 y 需要擬合的點的縱座標 n 以n階多項式進行擬合 c 返回的n 1個擬合係數。y polyval c,x 其中 c n 1個擬合係數 y 根據x 橫座標 ...
空間離散點擬合成空間平面
空間中的離散點得到擬合平面,其實這就是乙個最優化的過程。即求這些點到某個平面距離和最小的問題。我們知道乙個先驗訊息,那就是該平面一定會過眾散點的平均值。接著我們需要做的工作就是求這個平面的法向量。根據協方差矩陣的svd變換,最小奇異值對應的奇異向量就是平面的方向。隨機生成一組 x,y,z 這些點的座...