Trong bài đăng này, chúng tôi sẽ trình bày hướng dẫn từng bước về cách điều chỉnh đường cong phân phối Gaussian trên dữ liệu bằng cách sử dụng ngôn ngữ lập trình Python. Hướng dẫn này có thể được mở rộng để phù hợp với các phân phối thống kê khác trên dữ liệu
Ngày 7 tháng 6 năm 2022 • 7 phút đọcWahyudin Syam
Trong bài đăng này, chúng tôi sẽ trình bày hướng dẫn từng bước về cách điều chỉnh đường cong phân phối Gaussian trên dữ liệu bằng cách sử dụng ngôn ngữ lập trình Python. Hướng dẫn này có thể được mở rộng để phù hợp với các phân phối thống kê khác trên dữ liệu
Sự phù hợp của phân phối Gaussian trên dữ liệu rất hữu ích trong các hoạt động nghiên cứu và phát triển trong tất cả các ngành, bao gồm kỹ thuật, khoa học tự nhiên và xã hội cũng như y học
Một giới thiệu ngắn gọn về phân phối Gaussian được đưa ra như một sự làm mới về phân phối Gaussian
Chúng ta hãy đi vào chi tiết hướng dẫn
ĐỌC THÊM. Phân phối thống kê liên tục và rời rạc. Hàm mật độ/khối lượng xác suất, hàm phân bố tích lũy và định lý giới hạn trung tâm
Phân phối Gaussian [Bình thường]. giới thiệu ngắn
Biến ngẫu nhiên được định nghĩa là một biến thực được rút ra hoặc thu được từ một phép thử ngẫu nhiên hoặc phân phối ngẫu nhiên trong đó các giá trị của phép thử nằm trong một tập hợp mẫu cụ thể
Có hai loại biến ngẫu nhiên
- Biến ngẫu nhiên liên tục
- Biến ngẫu nhiên rời rạc
Biến ngẫu nhiên liên tục là biến ngẫu nhiên có giá trị trong một khoảng thực hoặc có giới hạn hoặc không có giới hạn
Trong khi đó, biến rời rạc là biến ngẫu nhiên có giá trị nằm trong một khoảng nguyên giới hạn [hữu hạn]. Lưu ý rằng đối với biến rời rạc, giá trị luôn nằm trong giới hạn hữu hạn
Phân phối Gaussian dành cho các biến ngẫu nhiên liên tục. Phân phối này là phân phối thống kê nổi tiếng nhất
Phân phối Gaussian đã được nghiên cứu từ lâu từ thế kỷ 18 và đã được hiểu rõ, ví dụ như các thuộc tính của nó
Ngoài ra, nhiều hiện tượng tự nhiên có phân bố giống hoặc tuân theo phân bố Gaussian. Nghĩa là nhiều hiện tượng tự nhiên có thể phù hợp với phân bố Gaussian để biểu diễn tính chất của hiện tượng
Hàm mật độ xác suất [PDF] của phân phối Gaussian được xây dựng như
Ở đâu $- \infty \leq x \leq \infty , - \infty \leq \mu \leq \infty , \sigma > 0$. $\sigma ^{2}$ là phương sai của phân phối và $\mu$ là giá trị trung bình hoặc trung bình của phân phối
biến
có thể được coi là hằng số $C$
LƯU Ý rằng chúng ta có thể thay đổi phương trình [1] thành các hàm phân phối thống kê khác để phù hợp với các đường cong phân phối của chúng
PDF của biến ngẫu nhiên $X$ là một hàm toán học mô tả xác suất của biến liên tục $X$ được rút ra từ phân phối thống kê liên tục, ví dụ như phân phối Gaussian, Hàm mũ và Gamma
Phân bố Gauss có dạng đường cong hình chuông. Hình 1 cho thấy các ví dụ về đường cong phân bố Gaussian hoặc hàm mật độ xác suất Gaussian [PDF]
ĐỌC THÊM. HƯỚNG DẪN. Macro Visual Basic cho Ứng dụng [VBA] trong Excel cho Mô phỏng Monte-Carlo
Hướng dẫn từng bước. Kết hợp phân phối Gaussian với dữ liệu bằng Python
Hướng dẫn từng bước để điều chỉnh Gaussian bằng cách sử dụng ngôn ngữ lập trình Python như sau
1. Nhập thư viện Python
Bước đầu tiên là chúng ta cần nhập các thư viện cần thiết cho chương trình Python. Chúng tôi sử dụng thư viện “Numpy” để thao tác ma trận, thư viện “Panda” để dễ dàng đọc tệp, “matplotlib” để vẽ đồ thị và thư viện “Scipy” để tối ưu hóa quy trình tối ưu hóa bình phương nhỏ nhất
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from scipy import stats
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
Thư viện quan trọng nhất là “Scipy. tối ưu hóa” cho quy trình khớp vuông góc nhỏ nhất thông qua chức năng “curve_fit”
from scipy.optimize import curve_fit
2. đọc dữ liệu
Việc tiếp theo là đọc dữ liệu từ một tệp. Tệp có thể là tệp excel, tệp csv hoặc tệp văn bản hoặc bất kỳ tệp nào khác. Trong trường hợp này, chúng tôi sử dụng tệp văn bản để đọc dữ liệu từ
folder_path = 'Data.txt'
df_data = pd.read_csv[folder_path, sep="\t", header=None]
các pd. read_csv[] có tiêu đề tham số được đặt là Không có. Vì dữ liệu của chúng tôi trong tệp văn bản không chứa bất kỳ tiêu đề nào, [chỉ có dữ liệu], chúng tôi sử dụng tất cả giá trị đọc làm dữ liệu bao gồm hàng đầu tiên
vì tất cả các thao tác dữ liệu như vectơ và ma trận đều ở dạng “Numpy”, chúng tôi chuyển đổi “khung dữ liệu panda” thành định dạng dữ liệu “numpy”
df_numpy=df_data.to_numpy[dtype ='float32']
Ví dụ về dữ liệu, trong tệp văn bản được mở bằng ứng dụng notepad, như được hiển thị bên dưới
Từ dữ liệu trên, sau khi đọc tệp văn bản, ma trận của chúng ta [khung dữ liệu Panda] sẽ có kích thước là nx2 ma trận
Vì vậy, việc đọc dữ liệu rất linh hoạt và chúng ta có thể thực hiện theo nhiều cách…tùy thuộc vào chúng ta
3. Quy trình lắp bình phương nhỏ nhất Gaussian
Vì dữ liệu có hai cột nên trong trường hợp này, chúng tôi chỉ muốn cột đầu tiên của dữ liệu khớp với đường cong phân bố Gaussian để
Hình thành những dữ liệu này, sau đó chúng tôi tính toán biểu đồ là
x_data=df_numpy[:,0]
#plotting the histogram
hist, bin_edges = np.histogram[x_data]
hist=hist/sum[hist]
Hình 2 cho thấy biểu đồ được tính toán và vẽ từ dữ liệu đã đọc. Từ biểu đồ này, sau đó chúng tôi điều chỉnh đường cong phân phối Gaussian
Sau đó, chúng tôi trích xuất thùng biểu đồ [$x$-axis] và các giá trị [$y$-axis] trong hình 2. Hai dữ liệu này sau đó được sử dụng để điều chỉnh đường cong Gaussian thông qua tối ưu hóa bình phương nhỏ nhất. Các mã để trích xuất thùng biểu đồ và các giá trị xác suất như sau
n = len[hist]
x_hist=np.zeros[[n],dtype=float]
for ii in range[n]:
x_hist[ii]=[bin_edges[ii+1]+bin_edges[ii]]/2
y_hist=hist
Bây giờ, chúng ta có mọi thứ để thực hiện khớp bình phương nhỏ nhất trên dữ liệu biểu đồ [hình 2]. Các mã dưới đây
#Calculating the Gaussian PDF values given Gaussian parameters and random variable X
def gaus[X,C,X_mean,sigma]:
return C*exp[-[X-X_mean]**2/[2*sigma**2]]
mean = sum[x_hist*y_hist]/sum[y_hist]
sigma = sum[y_hist*[x_hist-mean]**2]/sum[y_hist]
Quy trình khớp bình phương nhỏ nhất [tối ưu hóa] như sau
#Gaussian least-square fitting process
param_optimised,param_covariance_matrix = curve_fit[gaus,x_hist,y_hist,p0=[max[y_hist],mean,sigma],maxfev=5000]
Tham số được tối ưu hóa là $C$ [hằng số], $X_mean$ [giá trị trung bình] và $sigma$ [độ lệch chuẩn]. Việc tối ưu hóa ở trên về cơ bản là cực tiểu hóa hàm mục tiêu của
Để phù hợp với các phân phối thống kê khác, chúng ta chỉ cần thay đổi phương trình [1] và điều chỉnh tham số trong hàm “def gaus[params]”
4. Vẽ đường cong Gaussian
Cuối cùng, đồ thị của đường cong Gaussian phù hợp như trong hình 3 như sau
fig = plt.figure[]
x_hist_2=np.linspace[np.min[x_hist],np.max[x_hist],500]
plt.plot[x_hist_2,gaus[x_hist_2,*param_optimised],'r.:',label='Gaussian fit']
plt.legend[]
#Normalise the histogram values
weights = np.ones_like[x_data] / len[x_data]
plt.hist[x_data, weights=weights]
#setting the label,title and grid of the plot
plt.xlabel["Data: Random variable"]
plt.ylabel["Probability"]
plt.grid["on"]
plt.show[]
Mã Python để phù hợp với phân phối Gaussian
Mã đầy đủ để phù hợp với phân phối Gaussian cho dữ liệu như sau
# -*- coding: utf-8 -*-
"""
@author: wasy
"""
#STEP 1: IMPORT LIBRARIES ----------------------------------------------------
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from scipy import stats
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
#close all opened figure
plt.close["all"]
#STEP 2: DATA READING---------------------------------------------------------
folder_path = 'Data.txt'
df_data = pd.read_csv[folder_path, sep="\t", header=None]
#Covert Panda dataframe to numpy
df_numpy=df_data.to_numpy[dtype ='float32']
#STEP 3: GAUSSIAN LEAST-SQUARE FITTING ---------------------------------------
x_data=df_numpy[:,0]
hist, bin_edges = np.histogram[x_data]
hist=hist/sum[hist]
n = len[hist]
x_hist=np.zeros[[n],dtype=float]
for ii in range[n]:
x_hist[ii]=[bin_edges[ii+1]+bin_edges[ii]]/2
y_hist=hist
#Calculating the Gaussian PDF values given Gaussian parameters and random variable X
def gaus[X,C,X_mean,sigma]:
return C*exp[-[X-X_mean]**2/[2*sigma**2]]
mean = sum[x_hist*y_hist]/sum[y_hist]
sigma = sum[y_hist*[x_hist-mean]**2]/sum[y_hist]
#Gaussian least-square fitting process
param_optimised,param_covariance_matrix = curve_fit[gaus,x_hist,y_hist,p0=[max[y_hist],mean,sigma],maxfev=5000]
#print fit Gaussian parameters
print["Fit parameters: "]
print["====================================================="]
print["C = ", param_optimised[0], "+-",np.sqrt[param_covariance_matrix[0,0]]]
print["X_mean =", param_optimised[1], "+-",np.sqrt[param_covariance_matrix[1,1]]]
print["sigma = ", param_optimised[2], "+-",np.sqrt[param_covariance_matrix[2,2]]]
print["\n"]
#STEP 4: PLOTTING THE GAUSSIAN CURVE -----------------------------------------
fig = plt.figure[]
x_hist_2=np.linspace[np.min[x_hist],np.max[x_hist],500]
plt.plot[x_hist_2,gaus[x_hist_2,*param_optimised],'r.:',label='Gaussian fit']
plt.legend[]
#Normalise the histogram values
weights = np.ones_like[x_data] / len[x_data]
plt.hist[x_data, weights=weights]
#setting the label,title and grid of the plot
plt.xlabel["Data: Random variable"]
plt.ylabel["Probability"]
plt.grid["on"]
plt.show[]
Sự kết luận
Trong bài đăng này, một hướng dẫn từng bước về cách điều chỉnh đường cong phân phối Gaussian trên dữ liệu đã được trình bày. Kỹ thuật này rất hữu ích cho nghiên cứu và phân tích trong mọi lĩnh vực từ khoa học tự nhiên và xã hội, kỹ thuật đến y học
Hướng dẫn này sử dụng ngôn ngữ lập trình Python. Ngoài miễn phí, ngôn ngữ Python này còn nổi tiếng về phân tích khoa học. Các mã nguồn được sử dụng trong hướng dẫn này cũng được trình bày và có thể được sao chép để sử dụng
Ngoài ra, phần giới thiệu ngắn gọn về phân bố Gaussian cũng được đưa ra nhằm làm mới kiến thức của độc giả về phân bố Gaussian cũng như khái niệm cơ bản về hàm mật độ xác suất
Hướng dẫn điều chỉnh Gaussian này có thể được mở rộng để phù hợp với các phân phối thống kê khác với công thức phân phối đã biết
Chúng tôi bán tất cả các tệp nguồn, tệp EXE, tệp bao gồm và tệp LIB cũng như tài liệu về khớp hình elip bằng cách sử dụng thư viện C/C++, Qt framework, Eigen và OpenCV trong liên kết này
Chúng tôi bán các hướng dẫn [chứa tệp PDF, tập lệnh MATLAB và tệp CAD] về phân tích ngăn xếp dung sai 3D dựa trên phương pháp thống kê [Mô phỏng Monte-Carlo/MC]