Chuyển đến nội dung chính

Ước lượng mật độ nhân: Từ lý thuyết đến thực hành

Ước lượng mật độ nhân là một phương pháp phi tham số để ước lượng hình dạng của phân phối dữ liệu mà không giả định mô hình cố định. Tìm hiểu công thức, cách chọn băng thông, và triển khai thực hành trong Python và R.
Đã cập nhật 16 thg 6, 2026  · 11 phút đọc

Bạn từng cố trực quan hóa một phân phối, nhưng biểu đồ histogram lại thay đổi hình dạng mỗi lần bạn đổi kích thước bin?

Thường thì sẽ như thế này. Bạn chọn 10 bin và thấy một đường cong mượt. Rồi chuyển sang 30 bin thì xuất hiện nhiều đỉnh. Dữ liệu vẫn như cũ, nhưng số lượng bin khác nhau lại cho ra các cách diễn giải khác nhau. Đó là vấn đề lớn nhất của histogram: chúng không hiển thị phân phối thực sự, mà chỉ là một phiên bản của nó. Và phiên bản đó bị ảnh hưởng bởi một tham số bạn đặt khá tùy ý.

KDE tiếp cận theo cách khác. Thay vì chia dữ liệu thành các bin, nó đặt một đường cong nhỏ, mượt lên mỗi điểm dữ liệu và cộng tất cả lại. Kết quả là một ước lượng liên tục, duy nhất về phân phối ẩn phía sau.

Trong bài viết này, bạn sẽ có trực giác đằng sau KDE, phần giải thích công thức, cách băng thông kiểm soát độ mượt, và ví dụ thực hành bằng Python và R.

Bạn mới làm quen với histogram? Đây là hướng dẫn đầy đủ về Histogram tần suất để bạn bắt đầu.

Ước lượng mật độ nhân là gì?

Ước lượng mật độ nhân (KDE) là một phương pháp phi tham số để ước lượng hàm mật độ xác suất của một tập dữ liệu.

Chính tính phi tham số là điểm khác biệt của nó.

Với phương pháp tham số, bạn giả định dữ liệu tuân theo một phân phối cụ thể - chuẩn, mũ - rồi khớp các tham số cho phù hợp. Nếu giả định đó sai, mô hình của bạn sai. KDE không đưa ra những giả định như vậy. Nó để dữ liệu tự nói và xây dựng ước lượng trực tiếp về phân phối nền dựa trên các quan sát.

Đầu ra là một đường cong mượt cho bạn biết các giá trị có khả năng rơi vào đâu - và xác suất tương đối là bao nhiêu. Điểm cao trên đường cong tương ứng vùng dày đặc. Điểm thấp là vùng thưa.

Vì sao dùng ước lượng mật độ nhân?

Histogram là công cụ mặc định để trực quan hóa phân phối, nhưng có một vấn đề: hình dạng bạn thấy phụ thuộc vào số lượng bin bạn chọn. Và tham số bin đó là do bạn quyết định. Hai người có thể nhìn cùng một tập dữ liệu và rút ra kết luận hoàn toàn khác chỉ vì chọn số bin khác nhau.

Với KDE, thay vì ép dữ liệu vào các bin, nó cho ra một đường cong mượt, liên tục và không thay đổi dựa trên một tham số tùy ý bạn đặt từ trước.

Điều đó khiến nó hữu ích cho vài việc sau:

  • Trực quan hóa hình dạng tổng thể của phân phối mà không bị thiên lệch bởi kích thước bin
  • Phát hiện các mẫu như đa đỉnh, lệch, hoặc đuôi dày
  • So sánh phân phối giữa các nhóm trên cùng một biểu đồ
  • Có cái nhìn sạch hơn về dữ liệu trước khi mô hình hóa

Trực giác đằng sau KDE

Bạn lấy mỗi điểm dữ liệu và đặt lên đó một đường cong nhỏ, mượt. Đường cong đó gọi là kernel (nhân). Sau đó, chỉ cần cộng tất cả các đường cong riêng lẻ đó lại thành một.

Bạn thu được một đường cong mượt duy nhất thể hiện mật độ dữ liệu. Nơi các điểm tụ lại, nhiều kernel chồng lên nhau nên đường cong dâng cao. Nơi dữ liệu thưa, các kernel ít chồng lấp và đường cong thấp. Mỗi điểm đều đóng góp như nhau vào ước lượng cuối cùng.

Hãy tưởng tượng bạn ghi lại điểm thi cuối kỳ của một lớp. Thay vì gom vào histogram, KDE đặt một đường cong nhỏ, mượt lên mỗi điểm số. Nơi điểm số tụ lại - ví dụ quanh 70-75 - các đường cong chồng lên và ước lượng tăng. Một học sinh đạt 95 chỉ thêm một gợn nhỏ ở phần đuôi.

Hình minh họa dưới đây cho thấy đúng điều đó. Phần lớn học sinh đạt quanh mức trung bình, và có một học sinh đạt cao hơn nhiều:

KDE trực quan hóa

KDE được trực quan hóa

Công thức ước lượng mật độ nhân

Công thức KDE trông đáng sợ hơn thực tế.

Công thức KDE

Ý nghĩa của từng phần:

  • n là số lượng điểm dữ liệu

  • x_i là các điểm dữ liệu riêng lẻ trong tập dữ liệu của bạn

  • K là hàm kernel - đường cong mượt đặt lên mỗi điểm

  • h là băng thông - kiểm soát độ rộng của mỗi kernel

  • x là điểm tại đó bạn đánh giá mật độ

Nói đơn giản, công thức bảo rằng: với bất kỳ điểm x nào, hãy xem mỗi điểm dữ liệu x_i gần nó đến mức nào, cân trọng số cho độ gần đó bằng hàm kernel K, và lấy trung bình kết quả trên tất cả n điểm. Làm điều này cho mọi x trên toàn miền, bạn sẽ có toàn bộ đường cong mật độ.

Băng thông h nằm ở mẫu số của phân số bên trong K. h nhỏ làm kernel hẹp hơn, nên chỉ những điểm rất gần mới ảnh hưởng đến ước lượng. h lớn trải rộng ảnh hưởng hơn. Sẽ nói kỹ hơn ở phần sau.

Hàm kernel là gì?

Kernel là đường cong mượt bạn đặt lên mỗi điểm dữ liệu. Nó xác định cách ảnh hưởng của điểm đó lan sang các điểm lân cận.

Mỗi kernel được đặt tâm tại một điểm dữ liệu và gán trọng số dựa trên khoảng cách. Điểm gần tâm được trọng số cao. Điểm xa được trọng số thấp hoặc bằng không. Hình dạng chính xác của việc gán trọng số phụ thuộc vào kernel bạn chọn.

Có ba lựa chọn phổ biến:

  • Gaussian: Đường cong hình chuông. Gán trọng số cho mọi điểm trong tập, và ảnh hưởng giảm dần theo khoảng cách. Đây là mặc định trong hầu hết thư viện và hoạt động tốt trong thực tế
  • Uniform: Hình chữ nhật phẳng. Mọi điểm trong một khoảng cách cố định nhận trọng số như nhau, ngoài khoảng đó thì không. Đơn giản nhưng cho ước lượng kém mượt hơn
  • Epanechnikov: Dạng parabol được chứng minh là tối ưu về sai số bình phương trung bình. Hiệu quả hơn Gaussian nhưng hiếm khi tạo khác biệt rõ rệt trong thực tế.

Trong hầu hết trường hợp, lựa chọn kernel không quá quan trọng. Hai kernel khác nhau áp dụng lên cùng dữ liệu với cùng băng thông sẽ cho đường cong gần như giống hệt. Thứ quan trọng hơn nhiều là băng thông - và đó là nội dung tiếp theo.

Vai trò của băng thông trong KDE

Băng thông là tham số đơn lẻ ảnh hưởng lớn nhất đến đầu ra KDE của bạn, thậm chí hơn cả kernel bạn chọn.

Nó kiểm soát độ rộng của mỗi kernel. Kernel hẹp chỉ kéo ảnh hưởng từ các điểm gần. Kernel rộng lan ảnh hưởng trên phạm vi lớn hơn nhiều. Kết quả là một đường cong bám sát dữ liệu hoặc làm mượt trên dữ liệu.

Băng thông nhỏ

Băng thông nhỏ khiến mỗi kernel chặt và hẹp. Ước lượng phản ứng sắc nét với từng điểm dữ liệu, nghĩa là nó bắt được cấu trúc thực của dữ liệu, nhưng cũng cả nhiễu.

Trong thực tế, điều này trông như một đường cong lởm chởm với nhiều đỉnh nhỏ. Một số đỉnh phản ánh cụm thực sự trong dữ liệu. Số khác chỉ là tạo tác do làm mượt quá ít. Khó phân biệt cái nào là cái nào, và đó là vấn đề.

KDE với băng thông nhỏ

KDE với băng thông nhỏ

Băng thông lớn

Băng thông lớn làm mỗi kernel trải rộng. Các kernel lân cận chồng lấp, và đường cong cuối cùng trở nên mượt.

Nếu quá mượt, bạn bắt đầu mất cấu trúc thực. Hai cụm riêng biệt có thể nhòa thành một đường cong. Một phân phối có đuôi dày có thể trông đối xứng. Biểu diễn trực quan có thể đang che giấu điều gì đó.

KDE với băng thông lớn

KDE với băng thông lớn

Tìm băng thông phù hợp

Không có băng thông đúng một cách tuyệt đối. Mục tiêu là tìm giá trị đủ mượt để lọc nhiễu nhưng không quá mượt đến mức xóa bỏ các mẫu thực sự.

Hầu hết thư viện làm điều này bằng các phương pháp chọn băng thông tự động. Quy tắc kinh nghiệm của Silverman là phổ biến nhất. Nó chọn băng thông dựa trên kích thước mẫu và độ lệch chuẩn của dữ liệu. Hoạt động tốt với phân phối xấp xỉ chuẩn nhưng có thể làm quá mượt với phân phối đa đỉnh.

Nếu chưa chắc, hãy thử vài giá trị băng thông và so sánh các đường cong. Sự khác biệt sẽ nói cho bạn nhiều điều về dữ liệu.

KDE so với Histogram

Cả histogram và KDE đều cho bạn thấy phân phối dữ liệu - nhưng làm theo cách rất khác nhau.

Histogram

Histogram chia dữ liệu thành các bin rời rạc và đếm bao nhiêu điểm rơi vào mỗi bin. Nhanh, trực quan, và dễ giải thích với khán giả không chuyên.

Vấn đề là độ nhạy với số bin. Nếu bạn đổi số bin, hình dạng thay đổi. Không có số bin đúng một cách khách quan, đồng nghĩa hai người có thể nhìn cùng dữ liệu và rút ra kết luận khác nhau chỉ từ lựa chọn đó.

Histogram cũng tạo ra hình bậc thang, không liên tục. Ổn cho cái nhìn nhanh, nhưng có thể che mờ phân phối nền thực sự.

KDE

KDE cho bạn một đường cong mượt, liên tục mà không cần bin. Nó thể hiện tốt hơn hình dạng thực sự của phân phối - những yếu tố như độ lệch, đa đỉnh, hay đuôi dày mà histogram có thể bỏ lỡ hoặc trình bày sai tùy theo lựa chọn bin.

Đổi lại, KDE đưa vào tham số riêng - băng thông - và cần nhiều tính toán hơn. Nó cũng kém trực quan để giải thích, vì trục y biểu diễn mật độ xác suất, không phải số đếm, có thể gây nhầm cho người chưa quen khái niệm này.

Khi nào dùng mỗi loại

Dùng histogram khi bạn cần tóm tắt nhanh, dễ hiểu về dữ liệu hoặc khi khán giả không quen với ước lượng mật độ. Dùng KDE khi hình dạng phân phối quan trọng - ví dụ khi bạn so sánh các nhóm hoặc cố phát hiện nhiều mode trong dữ liệu.

Histogram so với KDE

So sánh Histogram với KDE

Trong thực tế, chúng thường được dùng cùng nhau: histogram để hiển thị số đếm, và đường KDE chồng lên để thể hiện hình dạng.

Ước lượng mật độ nhân trong Python

Python cung cấp vài cách để tính và vẽ KDE, tùy vào việc bạn cần biểu đồ nhanh hay kiểm soát sâu hơn với ước lượng.

Trực quan hóa KDE với seaborn

Cách nhanh nhất để có biểu đồ KDE là seaborn.kdeplot(). Chỉ cần thế này:

import seaborn as sns
import numpy as np

np.random.seed(42)
scores = np.concatenate([
    np.random.normal(65, 4, 60),
    np.random.normal(80, 3, 40)
])

sns.kdeplot(scores, bw_adjust=1)

KDE với seaborn

KDE với seaborn

Tham số bw_adjust tỉ lệ hóa băng thông được chọn tự động. Giá trị dưới 1 làm đường cong “chặt” hơn, trên 1 làm mượt hơn. Đây là hệ số nhân bổ sung lên băng thông seaborn chọn nội bộ, nên bạn không cần tự đặt giá trị băng thông thô.

Trục y hiển thị mật độ xác suất, không phải số đếm. Đường cong cho biết mức độ một giá trị có khả năng xuất hiện tương đối trong phân phối. Cao hơn nghĩa là nhiều dữ liệu tập trung ở đó hơn.

Tính KDE với scipy

Nếu bạn cần giá trị mật độ thực tế - không chỉ biểu đồ - hãy dùng scipy.stats.gaussian_kde. Công cụ này trả về một đối tượng có thể gọi để đánh giá tại bất kỳ điểm nào.

from scipy.stats import gaussian_kde
import numpy as np
import matplotlib.pyplot as plt

kde = gaussian_kde(scores, bw_method="scott")
x = np.linspace(45, 100, 500)
density = kde(x)

plt.plot(x, density)

bw_method="scott" sử dụng quy tắc của Scott để tự động chọn băng thông. Đây là mặc định tốt cho hầu hết trường hợp. Bạn cũng có thể truyền một số vô hướng để đặt băng thông thủ công.

KDE với scipy và matplotlib

KDE với scipy và matplotlib

Ước lượng mật độ nhân trong R

Trong R, KDE có sẵn trong ngôn ngữ. Bạn không cần gói bổ sung.

Tính KDE với density()

Hàm density() nhận một vector số và trả về một đối tượng KDE.

set.seed(42)
scores <- c(rnorm(60, mean = 65, sd = 4),
            rnorm(40, mean = 80, sd = 3))

kde <- density(scores, bw = "SJ")

Đối số bw điều khiển việc chọn băng thông. "SJ" sử dụng phương pháp Sheather-Jones, xử lý phân phối đa đỉnh tốt hơn mặc định. Bạn cũng có thể truyền một giá trị số để đặt băng thông thủ công.

Kết quả là một đối tượng list với hai thành phần chính:

  • kde$x: dãy điểm nơi mật độ được đánh giá
  • kde$y: các giá trị mật độ tương ứng

Vẽ đường cong

Chỉ cần truyền kết quả trực tiếp vào plot().

plot(kde,
     main = "Exam Score Distribution",
     xlab = "Score",
     ylab = "Density")

KDE vẽ trong R

Để chồng KDE lên histogram, dùng hist() với freq = FALSE trước, rồi thêm đường cong bằng lines().

hist(scores, freq = FALSE, main = "Histogram + KDE", xlab = "Score")
lines(kde, col = "blue", lwd = 2)

Histogram với KDE trong R

freq = FALSE chuẩn hóa histogram về mật độ để cả cột và đường cong dùng chung trục y.

Ưu điểm và hạn chế của KDE

KDE là một trực quan thực sự hữu ích, nhưng như mọi thứ, nó có những đánh đổi đáng lưu ý trước khi bạn dùng để thay thế histogram.

Ưu điểm

Điểm mạnh lớn nhất là KDE không giả định phân phối của dữ liệu. Bạn không cần quyết định trước liệu dữ liệu là chuẩn, mũ hay gì khác. Hình dạng xuất phát từ chính dữ liệu, giúp KDE đủ linh hoạt để xử lý phân phối đa đỉnh và các dạng không khớp mô hình tham số tiêu chuẩn.

Đầu ra cũng là một đường cong mượt, liên tục thay vì xấp xỉ bậc thang. Nhờ đó dễ phát hiện các mẫu - như đa đỉnh hay đuôi dài - mà histogram có thể che khuất tùy theo lựa chọn bin.

Và vì KDE làm việc trực tiếp trên dữ liệu thô mà không cần bạn khớp mô hình trước, nó là bước khởi đầu tốt cho mọi phân tích khám phá.

Hạn chế

Chọn băng thông là điểm yếu chính. Nếu chọn sai, ước lượng hoặc đuổi theo nhiễu, hoặc làm mượt đến mức che khuất các mẫu thực trong dữ liệu. Các phương pháp tự động như quy tắc của Silverman hoạt động tốt với dữ liệu xấp xỉ chuẩn, nhưng có thể gây hiểu lầm với phân phối phức tạp. Bạn thường cần kiểm tra thủ công vài giá trị băng thông trước khi tin vào kết quả.

Hiệu năng có thể trở thành vấn đề ở quy mô lớn. KDE đánh giá hàm kernel cho mọi điểm dữ liệu tại mọi vị trí đánh giá, tức khối lượng tính toán tăng nhanh khi tập dữ liệu lớn hơn. Với hầu hết công việc khám phá điều này không phải vấn đề, nhưng có thể chậm với tập hàng trăm nghìn điểm.

Hiệu ứng biên là vấn đề tinh vi hơn. KDE tiêu chuẩn giả định dữ liệu có thể kéo dài vô hạn theo cả hai hướng. Khi dữ liệu của bạn có ranh giới cứng - như giá trị không thể nhỏ hơn không - ước lượng sẽ “rò rỉ” khối lượng xác suất ra ngoài ranh giới hợp lệ, khiến đường cong bị thấp giả tạo gần mép. Có các phiên bản KDE hiệu chỉnh biên, nhưng ít được triển khai trong các thư viện chuẩn.

Kết luận

KDE mang đến cách nhìn sạch hơn về phân phối dữ liệu so với histogram. Không cần chọn bin và không có giả định tham số - chỉ là một đường cong mượt thể hiện những gì thật sự có trong tập dữ liệu của bạn.

Băng thông là tham số duy nhất thực sự quan trọng. Hãy thử vài giá trị, so sánh các đường cong, dùng tùy chọn tự động, và đảm bảo ước lượng khớp với hiểu biết của bạn về dữ liệu trước khi rút ra kết luận.

Cách tốt nhất để xây dựng trực giác về KDE là chạy nó trên dữ liệu thực. Chọn một tập dữ liệu bạn đã quen thuộc, áp dụng KDE, và so sánh với histogram để xem bạn đã bỏ lỡ điều gì.

Quan tâm đến trực quan hóa dữ liệu? Hãy xem khóa học về Trực quan hóa dữ liệu với Seaborn nếu bạn dùng Python, hoặc Trực quan hóa dữ liệu với ggplot2 nếu bạn dùng R.


Dario Radečić's photo
Author
Dario Radečić
LinkedIn
Chuyên gia Khoa học Dữ liệu Cấp cao, làm việc tại Croatia. Tác giả Công nghệ Hàng đầu với hơn 700 bài viết đã xuất bản, đạt trên 10 triệu lượt xem. Tác giả cuốn sách Tự động hóa Machine Learning với TPOT.

FAQs

Ước lượng mật độ nhân được dùng để làm gì?

KDE được dùng để ước lượng phân phối xác suất của một tập dữ liệu mà không giả định nó tuân theo một hình dạng cụ thể như phân phối chuẩn hoặc mũ. Nó phổ biến trong phân tích thăm dò dữ liệu, nơi bạn muốn trực quan hóa cách dữ liệu phân bố trước khi mô hình hóa. Bạn cũng sẽ thấy nó được dùng trong phát hiện bất thường, so sánh phân phối giữa các nhóm, và như một bước làm mượt trong các quy trình thống kê.

KDE khác gì so với histogram?

Histogram chia dữ liệu thành các bin rời rạc và đếm bao nhiêu điểm rơi vào mỗi bin. Hình dạng bạn nhận được phụ thuộc vào số bin bạn chọn, khiến nó nhạy với một tham số tùy ý. KDE tránh điều này bằng cách đặt một đường cong mượt lên mỗi điểm dữ liệu và cộng chúng lại, cho bạn ước lượng liên tục không thay đổi theo số bin.

Có cần tập dữ liệu lớn để dùng KDE không?

KDE hoạt động với tập dữ liệu nhỏ, nhưng ước lượng kém tin cậy khi bạn có rất ít điểm. Với dữ liệu hạn chế, các quan sát cá nhân có ảnh hưởng lớn đến đường cong cuối cùng, khiến khó tách cấu trúc thực khỏi nhiễu. Khi tập dữ liệu lớn hơn, ước lượng ổn định và phản ánh phân phối thực chính xác hơn.

Điều gì xảy ra nếu bạn chọn sai băng thông?

Băng thông quá nhỏ tạo ra đường cong lởm chởm phản ứng với từng điểm riêng lẻ, khiến khó nhìn thấy hình dạng tổng thể của dữ liệu. Băng thông quá lớn làm mượt quá mức và có thể gộp các đỉnh riêng biệt thành một ụ duy nhất, che khuất cấu trúc thực. Hầu hết thư viện cung cấp phương pháp chọn băng thông tự động như quy tắc của Silverman để bắt đầu, nhưng tốt nhất bạn nên thử thủ công vài giá trị trước khi kết luận.

KDE có hoạt động tốt gần ranh giới dữ liệu không?

KDE tiêu chuẩn giả định dữ liệu có thể kéo dài vô hạn theo cả hai hướng, điều này gây vấn đề khi biến của bạn có giới hạn dưới hoặc trên cứng - như tuổi, thu nhập, hay bất kỳ số đếm nào không thể nhỏ hơn không. Gần các ranh giới đó, ước lượng sẽ “rò rỉ” khối lượng xác suất ra ngoài phạm vi hợp lệ, làm đường cong bị thấp giả tạo ở mép. Các phương pháp KDE hiệu chỉnh biên tồn tại để xử lý điều này, nhưng không có sẵn trong mọi thư viện và cần thiết lập bổ sung.

Chủ đề

Học với DataCamp

Courses

Support Vector Machines bằng R

4 giờ
11K
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow