Nếu bạn không chuẩn hóa dữ liệu của mình thì các biến được đo bằng đơn vị có giá trị lớn sẽ chi phối sự khác biệt được tính toán và các biến được đo bằng đơn vị có giá trị nhỏ sẽ đóng góp rất ít.
Chúng ta có thể hình dung điều này trong R thông qua:
set.seed(42)
dat <- data.frame(var1 = rnorm(100, mean = 100000),
var2 = runif(100),
var3 = runif(100))
dist1 <- dist(dat)
dist2 <- dist(dat[,1, drop = FALSE])
dist1
chứa khoảng cách Euclide cho 100 quan sát dựa trên cả ba biến trong khi dist2
chứa khoảng cách Euclide chỉ dựa trên var1
một mình.
> summary(dist1)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.07351 0.77840 1.15200 1.36200 1.77000 5.30200
> summary(dist2)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000072 0.470000 0.963600 1.169000 1.663000 5.280000
Lưu ý cách phân phối khoảng cách tương tự nhau, biểu thị sự đóng góp nhỏ từ var2
và var3
, và khoảng cách thực tế rất giống nhau:
> head(dist1)
[1] 1.9707186 1.0936524 0.8745579 1.2724471 1.6054603 0.1870085
> head(dist2)
[1] 1.9356566 1.0078300 0.7380958 0.9666901 1.4770830 0.1405636
Nếu chúng ta chuẩn hóa dữ liệu
dist3 <- dist(scale(dat))
dist4 <- dist(scale(dat[,1, drop = FALSE]))
sau đó, có một sự thay đổi lớn về khoảng cách chỉ dựa trên var1
và những khoảng cách dựa trên cả ba biến:
> summary(dist3)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.09761 1.62400 2.25000 2.28200 2.93600 5.33100
> summary(dist4)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000069 0.451400 0.925400 1.123000 1.597000 5.070000
> head(dist3)
[1] 2.2636288 1.7272588 1.7791074 3.0129750 2.5821981 0.4434073
> head(dist4)
[1] 1.8587830 0.9678046 0.7087827 0.9282985 1.4184214 0.1349811
Vì phân cụm phân cấp sử dụng các khoảng cách này, nên có muốn chuẩn hóa hay không sẽ phụ thuộc vào loại dữ liệu / biến bạn có và liệu bạn có muốn những thứ lớn chi phối khoảng cách và do đó chi phối sự hình thành của cụm. Câu trả lời cho điều này là tên miền cụ thể và dữ liệu cụ thể.