線性迴歸是資料分析中重要的技術,用於找出資料間的線性關係。本文除了基本的線性迴歸,也探討了非線性擬合與樣條插值技術,並搭配 Python 程式碼與圖表說明。理解這些技術能幫助我們更有效地分析和視覺化資料,找出資料背後的規律。程式碼中使用 Matplotlib 函式庫繪製圖表,並計算均方根誤差 (RMS) 來評估模型的擬合程度。此外,文章也說明瞭如何使用迴圈搜尋最佳擬合引數,以及如何利用三次樣條插值技術來處理非線性資料。這些技術的結合,能讓我們更全面地理解和應用資料分析方法。
線性迴歸分析在資料視覺化中的應用
在資料分析和視覺化的過程中,線性迴歸是一種常見且重要的技術。本文將深入探討如何使用Python實作線性迴歸分析,並將結果視覺化,同時詳細解析相關的數學原理和程式實作。
線性迴歸的基本原理
線性迴歸的主要目標是找到一條最佳擬合直線,使其盡可能接近給定的資料點。假設我們有一組資料點 $(t_i, v_i)$,我們的目標是找到引數 $A$ 和 $B$,使得直線 $v = At + B$ 盡可能擬合這些資料點。
相關數學公式推導
為了實作最佳擬合,我們需要最小化誤差平方和: $$ e = \sum_{i=1}^{n} (v_i - (At_i + B))^2 $$ 這個過程涉及到計算以下四個關鍵係數: $$ C_1 = \frac{1}{n} \sum_{i=1}^{n} t_i \ C_2 = \frac{1}{n} \sum_{i=1}^{n} v_i \ C_3 = \sum_{i=1}^{n} v_i t_i \ C_4 = \sum_{i=1}^{n} t_i^2 $$ 然後根據這些係數計算 $A$ 和 $B$: $$ A = \frac{C_3 - nC_1C_2}{C_4 - nC_1^2} \ B = C_2 - AC_1 $$
Python實作程式碼解析
import numpy as np
import matplotlib.pyplot as plt
# 假設 t 和 v 是已知的資料點
n = len(t)
C1 = np.sum(t)/n # 計算 t 的平均值
C2 = np.sum(v)/n # 計算 v 的平均值
a = np.multiply(v, t) # 計算 v 和 t 的乘積
C3 = np.sum(a) # 計算 v*t 的總和
a = np.multiply(t, t) # 計算 t 的平方
C4 = np.sum(a) # 計算 t^2 的總和
# 計算迴歸直線的引數
A = (C3 - n*C1*C2)/(C4 - n*C1*C1)
B = C2 - A*C1
# 繪製迴歸直線
for tp in np.arange(t[0], t[-1], 2):
vp = A*tp + B
plt.scatter(tp, vp*100, color='g', s=1)
# 計算RMS誤差
sumee = 0
for i in range(len(t)):
e = (v[i] - (A*t[i] + B))
ee = e*e
sumee += ee
rms = np.sqrt(sumee/n)
# 繪製相關資訊
plt.text(60, 28, 'v=At+B', color='g')
plt.text(2, 64, f'{A*t[0]+B:.4f}', color='g')
plt.text(122, 25, f'{A*t[-1]+B:.4f}', color='g')
plt.text(65, 18, f'A={A:.5f}', color='g')
plt.text(73, 12, f'B={B:.5f}', color='g')
plt.text(123, 3, f'RMS={rms:.3f}', color='g')
plt.show()
程式碼詳細解析
- 資料準備:首先需要準備時間序列
t和對應的數值v。 - 引數計算:透過上述公式計算迴歸直線的引數 $A$ 和 $B$。
- 結果視覺化:使用
matplotlib繪製原始資料點和迴歸直線。 - 誤差分析:計算並顯示RMS(均方根)誤差,以評估擬合優度。
非線性函式擬合
當資料不符合線性關係時,可以嘗試使用非線性函式進行擬合。例如,使用二次函式 $v = Ax^2 + B$ 進行擬合:
# 定義搜尋範圍
B1, B2 = 0.5, 0.7 # B 的搜尋範圍
A1, A2 = -0.001, 0 # A 的搜尋範圍
dB = 0.0001 # B 的搜尋步長
dA = 0.00001 # A 的搜尋步長
# 初始化最小誤差
eemin = float('inf')
Amin = Bmin = None
# 迴圈搜尋最佳引數
for B in np.arange(B1, B2, dB):
for A in np.arange(A1, A2, dA):
sumee = 0
for i in range(len(t)):
e = v[i] - (A*t[i]**2 + B)
ee = e**2
sumee += ee
if sumee < eemin:
eemin = sumee
Amin = A
Bmin = B
# 繪製最佳擬合曲線
for tp in np.arange(t[0], t[-1], 2):
vp = Amin*tp**2 + Bmin
plt.scatter(tp, vp, color='r', s=1)
Plantuml流程圖展示分析過程
圖表翻譯
此圖展示了非線性函式擬合的主要流程。首先進行引數初始化,然後進入迴圈搜尋最佳引數的過程。在每次迴圈中,計算當前引數下的誤差,並與歷史最小誤差進行比較。如果當前誤差更小,則更新最佳引數。最後,使用最佳引數繪製擬合曲線。這個過程清晰地展示瞭如何透過迭代最佳化來找到最佳的函式擬合引數。
迴歸分析與曲線擬合技術在資料分析中的應用
在資料分析和科學計算領域,曲線擬合是一項至關重要的技術。透過迴歸分析,我們可以對給定的資料點進行擬合,以獲得一個能夠描述資料變化趨勢的數學模型。本文將詳細介紹使用Python進行迴歸分析和曲線擬合的技術,包括程式碼實作、引數最佳化以及結果視覺化等內容。
迴歸分析的基本原理
迴歸分析是一種統計學方法,用於建立變數之間的關係模型。在曲線擬閤中,我們通常使用迴歸分析來找到一個函式,使其能夠最好地擬合給定的資料點。常見的迴歸模型包括線性迴歸、多項式迴歸和非線性迴歸等。
使用Python實作曲線擬合
以下是一個使用Python進行曲線擬合的範例程式碼:
import numpy as np
import matplotlib.pyplot as plt
# 定義資料點
t = np.array([0, 20, 40, 60, 80, 100])
v = np.array([0, 20, 40, 60, 80, 100])
# 定義擬合函式
def func(t, A, B):
return A * t**2 + B
# 初始化引數
B1 = 0.5
B2 = 0.7
dB = 0.001
A1 = -0.001
A2 = 0.0
dA = 0.0000001
# 進行曲線擬合
n = len(v)
eemin = 10**10
for B in np.arange(B1, B2, dB):
for A in np.arange(A1, A2, dA):
sumee = 0
for i in range(n):
e = v[i] - func(t[i], A, B)
ee = e**2
sumee += ee
if sumee < eemin:
eemin = sumee
Amin = A
Bmin = B
# 計算RMS誤差
sumee = 0
for i in range(n):
e = v[i] - func(t[i], Amin, Bmin)
ee = e**2
sumee += ee
rms = np.sqrt(sumee / n)
# 繪製擬合曲線
tp = np.arange(t[0], t[-1], 2)
vp = func(tp, Amin, Bmin) * 100
plt.scatter(tp, vp, color='g', s=1)
# 顯示結果
plt.text(100, 50, 'v=At+B', color='g')
plt.arrow(99, 50, -6.5, -6.5, head_length=3, head_width=1.5, color='g', linewidth=0.5)
plt.text(2, 63, f'{func(t[0], Amin, Bmin):.3f}', color='g')
plt.text(119, 22, f'{func(t[-1], Amin, Bmin):.3f}', color='g')
plt.text(59, 18, f'Amin={Amin:.6f}', color='g')
plt.text(59, 12, f'Bmin={Bmin:.6f}', color='g')
plt.text(95, 3, f'RMS error={rms:.4f}', color='g')
plt.show()
程式碼解析
- 資料定義:首先定義了資料點
t和v。 - 擬合函式:定義了一個二次函式
func作為擬合函式。 - 引數初始化:初始化了引數
A和B的搜尋範圍和步長。 - 曲線擬合:使用巢狀迴圈遍歷引數空間,找到使誤差平方和最小的引數
Amin和Bmin。 - RMS誤差計算:計算了擬合曲線的RMS誤差。
- 結果視覺化:繪製了擬合曲線並顯示了相關的引數和RMS誤差。
三次樣條插值技術
除了迴歸分析,樣條插值也是資料分析中的重要技術。三次樣條插值能夠提供平滑的曲線擬合,並且在資料點之間具有良好的連續性和可導性。
三次樣條插值的數學原理
三次樣條插值透過在每個資料點區間內使用一個三次多項式來建構擬合曲線。這些多項式在資料點處具有連續的一階和二階導數,從而保證了曲線的平滑性。
圖表翻譯
此圖示展示了三次樣條插值的過程。首先,根據給定的資料點建構三次樣條插值函式。然後,透過這些插值函式生成平滑的曲線。最終得到的曲線在資料點之間具有良好的連續性和可導性。
隨著資料量的不斷增加和計算能力的提升,迴歸分析和曲線擬合技術將朝著更加高效、準確和智慧化的方向發展。未來可能的研究方向包括:
- 深度學習在曲線擬閤中的應用:利用深度學習模型進行曲線擬合,提高擬合精確度和效率。
- 高維資料的擬合技術:研究高維資料的擬合方法和技術,滿足日益增長的高維資料分析需求。
- 實時資料擬合技術:開發實時資料擬合技術,滿足實時資料分析和處理的需求。
Plantuml圖表範例
圖表翻譯
此圖示展示了資料分析和曲線擬合的基本流程。首先,進行資料收集和預處理。然後,使用適當的曲線擬合技術對資料進行擬合。接著,對擬合結果進行分析。最後,將結果視覺化,以便更好地理解資料的變化趨勢和擬合效果。
二維資料繪圖技術詳解
在資料分析和視覺化領域,二維資料繪圖是一項基礎且重要的技術。本文將深入探討二維資料繪圖的各種技術,包括簡單點的繪製、函式繪製、多函式繪製、軸標籤處理、線性迴歸、函式擬合以及樣條插值等。
樣條插值原理
樣條插值是一種透過已知資料點來構建平滑曲線的方法。在二維空間中,樣條插值可以生成一條透過所有給定點的連續且平滑的曲線。樣條插值的實作根據三次多項式方程,每個區間內使用一個三次多項式來逼近曲線。
樣條插值係數計算
樣條插值的係數計算根據以下條件:
- 在資料點處,樣條曲線的函式值必須與資料點的函式值一致。
- 在資料點處,樣條曲線的一階導數(斜率)必須連續。
- 在資料點處,樣條曲線的二階導數(曲率)必須連續。
這些條件確保了樣條曲線的平滑性和連續性。在樣條曲線的端點處,通常採用「自然樣條」的條件,即二階導數為零。
def calculate_spline_coefficients(x, y):
nop = len(x)
q = [0] * nop
mx = [0] * nop
my = [0] * nop
ax = [0] * nop
ay = [0] * nop
bx = [0] * nop
by = [0] * nop
cx = [0] * nop
cy = [0] * nop
dx = [0] * nop
dy = [0] * nop
# 計算弦長
for i in range(1, nop):
a = x[i] - x[i-1]
b = y[i] - y[i-1]
q[i-1] = (a**2 + b**2)**0.5
# 計算初始斜率
mx[0] = (x[1] - x[0]) / q[0]
my[0] = (y[1] - y[0]) / q[0]
# 計算中間斜率
for i in range(1, nop-1):
mx[i] = ((x[i] - x[i-1]) / q[i-1] + (x[i+1] - x[i]) / q[i]) * 0.5
my[i] = ((y[i] - y[i-1]) / q[i-1] + (y[i+1] - y[i]) / q[i]) * 0.5
# 計算末端斜率
mx[nop-1] = (x[nop-1] - x[nop-2]) / q[nop-2]
my[nop-1] = (y[nop-1] - y[nop-2]) / q[nop-2]
# 計算樣條係數
for i in range(nop-1):
dx[i] = x[i]
dy[i] = y[i]
cx[i] = mx[i]
cy[i] = my[i]
bx[i] = (3*x[i+1] - 2*cx[i]*q[i] - 3*dx[i] - mx[i+1]*q[i]) / (q[i]**2)
by[i] = (3*y[i+1] - 2*cy[i]*q[i] - 3*dy[i] - my[i+1]*q[i]) / (q[i]**2)
ax[i] = (mx[i+1] - 2*bx[i]*q[i] - cx[i]) / (3*q[i]**2)
ay[i] = (my[i+1] - 2*by[i]*q[i] - cy[i]) / (3*q[i]**2)
return ax, ay, bx, by, cx, cy, dx, dy, q
#### 圖表翻譯:
此圖示展示了樣條插值的基本流程,包括資料點的選取、弦長的計算、斜率的計算以及樣條係數的計算。透過這些步驟,可以構建出平滑的樣條曲線。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Python線性迴歸與資料視覺化技術
package "統計分析流程" {
package "資料收集" {
component [樣本資料] as sample
component [母體資料] as population
}
package "描述統計" {
component [平均數/中位數] as central
component [標準差/變異數] as dispersion
component [分佈形狀] as shape
}
package "推論統計" {
component [假設檢定] as hypothesis
component [信賴區間] as confidence
component [迴歸分析] as regression
}
}
sample --> central : 計算
sample --> dispersion : 計算
central --> hypothesis : 檢驗
dispersion --> confidence : 估計
hypothesis --> regression : 建模
note right of hypothesis
H0: 虛無假設
H1: 對立假設
α: 顯著水準
end note
@enduml
圖表翻譯:
此圖示展示了樣條插值的計算流程,從初始的弦長計算到最終的樣條曲線繪製。這個過程確保了曲線的平滑性和連續性。
樣條曲線繪製
樣條曲線的繪製根據計算出的樣條係數,透過對每個區間內的三次多項式進行評估,可以得到曲線上的點。然後,透過連線這些點來繪製出平滑的樣條曲線。
def plot_spline(x, y, clr, ls):
ax, ay, bx, by, cx, cy, dx, dy, q = calculate_spline_coefficients(x, y)
nop = len(x)
xplast = x[0]
yplast = y[0]
for i in range(nop-1):
for qq in np.arange(0, q[i], 4):
xp = ax[i]*qq**3 + bx[i]*qq**2 + cx[i]*qq + dx[i]
yp = ay[i]*qq**3 + by[i]*qq**2 + cy[i]*qq + dy[i]
plt.plot([xplast, xp], [yplast, yp], linewidth=1, color=clr, linestyle=ls)
xplast = xp
yplast = yp
plt.scatter(x, y, s=30, color=clr)
plt.show()
內容解密:
此程式碼實作了樣條曲線的繪製。首先,透過calculate_spline_coefficients函式計算樣條係數。然後,根據這些係數,在每個區間內透過評估三次多項式來計算曲線上的點。最後,透過連線這些點來繪製出平滑的樣條曲線。同時,原始資料點也被標記在圖上。
應使用案例項
樣條插值在多個領域有廣泛的應用,如:
- 電腦圖形學:用於生成平滑的曲線和曲面。
- 資料分析:用於擬合實驗資料,生成平滑的曲線以便於分析和視覺化。
- 工程設計:用於設計平滑的曲線,如飛機、汽車的形狀設計。
透過上述例項和分析,我們可以看到樣條插值是一種強大且靈活的工具,能夠有效地處理二維資料繪圖的需求。