Trong hướng dẫn này, bạn sẽ học
- Phân tích cụm là gì?
- Thuật toán K-mean
- Tối ưu k
Phân tích cụm là gì?
Phân tích cụm là một phần của việc học không giám sát . Cụm là một nhóm dữ liệu chia sẻ các tính năng tương tự. Có thể nói, phân tích phân cụm thiên về khám phá hơn là dự đoán. Máy tìm kiếm sự tương đồng trong dữ liệu. Ví dụ: bạn có thể sử dụng phân tích cụm cho ứng dụng sau:
- Phân khúc khách hàng: Tìm kiếm sự tương đồng giữa các nhóm khách hàng
- Phân nhóm thị trường chứng khoán: Nhóm cổ phiếu dựa trên kết quả hoạt động
- Giảm kích thước của tập dữ liệu bằng cách nhóm các quan sát có giá trị tương tự nhau
Phân tích phân cụm không quá khó để thực hiện và có ý nghĩa cũng như hành động đối với doanh nghiệp.
Sự khác biệt nổi bật nhất giữa học tập có giám sát và không giám sát nằm ở kết quả. Học tập không giám sát tạo ra một biến mới, nhãn, trong khi học tập có giám sát dự đoán kết quả. Máy giúp người thực hành trong nhiệm vụ gắn nhãn dữ liệu dựa trên mối quan hệ gần gũi. Nhà phân tích sử dụng các nhóm và đặt tên cho chúng là tùy thuộc vào nhà phân tích.
Hãy làm một ví dụ để hiểu khái niệm phân cụm. Để đơn giản, chúng tôi làm việc theo hai chiều. Bạn có dữ liệu về tổng chi tiêu của khách hàng và độ tuổi của họ. Để cải thiện quảng cáo, nhóm tiếp thị muốn gửi nhiều email được nhắm mục tiêu hơn đến khách hàng của họ.
Trong biểu đồ sau, bạn vẽ biểu đồ tổng chi tiêu và độ tuổi của khách hàng.
library(ggplot2)df <- data.frame(age = c(18, 21, 22, 24, 26, 26, 27, 30, 31, 35, 39, 40, 41, 42, 44, 46, 47, 48, 49, 54),spend = c(10, 11, 22, 15, 12, 13, 14, 33, 39, 37, 44, 27, 29, 20, 28, 21, 30, 31, 23, 24))ggplot(df, aes(x = age, y = spend)) +geom_point()
Một mẫu có thể nhìn thấy tại thời điểm này
- Ở phía dưới bên trái, bạn có thể thấy những người trẻ tuổi có sức mua thấp hơn
- Thượng trung bình phản ánh những người có công việc mà họ có thể chi tiêu nhiều hơn
- Cuối cùng là những người lớn tuổi với ngân sách thấp hơn.
Trong hình trên, bạn phân cụm các quan sát bằng tay và xác định từng nhóm trong số ba nhóm. Ví dụ này hơi đơn giản và có tính trực quan cao. Nếu các quan sát mới được thêm vào tập dữ liệu, bạn có thể gắn nhãn chúng trong các vòng kết nối. Bạn xác định vòng tròn dựa trên nhận định của chúng tôi. Thay vào đó, bạn có thể sử dụng Học máy để nhóm dữ liệu một cách khách quan.
Trong hướng dẫn này, bạn sẽ học cách sử dụng thuật toán k- mean.
Thuật toán K-mean
K-mean, không nghi ngờ gì, là phương pháp phân cụm phổ biến nhất. Các nhà nghiên cứu đã phát hành thuật toán cách đây nhiều thập kỷ và rất nhiều cải tiến đã được thực hiện cho k-means.
Thuật toán cố gắng tìm các nhóm bằng cách giảm thiểu khoảng cách giữa các quan sát, được gọi là các giải pháp tối ưu cục bộ . Khoảng cách được đo dựa trên tọa độ của các quan sát. Ví dụ, trong không gian hai chiều, tọa độ đơn giản và.
Thuật toán hoạt động như sau:
- Bước 1: Chọn ngẫu nhiên các nhóm trong gói tính năng
- Bước 2: Giảm thiểu khoảng cách giữa trung tâm cụm và các quan sát khác nhau ( centroid ). Kết quả là các nhóm có quan sát
- Bước 3: Chuyển tâm ban đầu sang trung bình của các tọa độ trong một nhóm.
- Bước 4: Thu nhỏ khoảng cách theo các centroid mới. Các ranh giới mới được tạo ra. Do đó, các quan sát sẽ chuyển từ nhóm này sang nhóm khác
- Lặp lại cho đến khi không có quan sát nào thay đổi nhóm
K-mean thường lấy khoảng cách Euclidean giữa đối tượng địa lý và đối tượng địa lý:
Các thước đo khác nhau có sẵn như khoảng cách Manhattan hoặc khoảng cách Minlowski. Lưu ý rằng, K-mean trả về các nhóm khác nhau mỗi khi bạn chạy thuật toán. Nhớ lại rằng các phỏng đoán ban đầu đầu tiên là ngẫu nhiên và tính toán khoảng cách cho đến khi thuật toán đạt được sự đồng nhất trong các nhóm. Nghĩa là, k-mean rất nhạy cảm với lựa chọn đầu tiên, và trừ khi số lượng quan sát và nhóm nhỏ, thì hầu như không thể có được cùng một nhóm.
Chọn số lượng cụm
Một khó khăn khác được tìm thấy với k-mean là sự lựa chọn số lượng các cụm. Bạn có thể đặt giá trị cao, tức là một số lượng lớn các nhóm, để cải thiện độ ổn định nhưng bạn có thể kết thúc với việc trang bị quá nhiều dữ liệu. Trang bị quá mức có nghĩa là hiệu suất của mô hình giảm đáng kể đối với dữ liệu mới sắp xuất hiện. Máy đã học những chi tiết nhỏ của tập dữ liệu và đấu tranh để khái quát hóa mẫu tổng thể.
Số lượng cụm phụ thuộc vào bản chất của tập dữ liệu, ngành, doanh nghiệp, v.v. Tuy nhiên, có một quy tắc chung để chọn số lượng cụm thích hợp:
với số lượng quan sát trong tập dữ liệu.
Nói chung, thật thú vị khi dành thời gian để tìm kiếm giá trị tốt nhất phù hợp với nhu cầu kinh doanh.
Chúng tôi sẽ sử dụng tập dữ liệu Giá của Máy tính Cá nhân để thực hiện phân tích nhóm của chúng tôi. Tập dữ liệu này chứa 6259 quan sát và 10 tính năng. Bộ dữ liệu quan sát giá từ năm 1993 đến 1995 của 486 máy tính cá nhân ở Mỹ. Các biến là giá cả, tốc độ, ram, màn hình, cd và các biến khác.
Bạn sẽ tiến hành như sau:
- Nhập dữ liệu
- Đào tạo mô hình
- Đánh giá mô hình
Nhập dữ liệu
K nghĩa là không phù hợp với các biến nhân tố vì nó dựa trên khoảng cách và các giá trị rời rạc không trả về giá trị có ý nghĩa. Bạn có thể xóa ba biến phân loại trong tập dữ liệu của chúng tôi. Ngoài ra, không có giá trị nào bị thiếu trong tập dữ liệu này.
library(dplyr)PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/computers.csv"df <- read.csv(PATH) %>%select(-c(X, cd, multi, premium))glimpse(df)Đầu ra
## Observations: 6, 259## Variables: 7## $ price < int > 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2… ##$ speed < int > 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25,… ##$ hd < int > 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210… ##$ ram < int > 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4,… ##$ screen < int > 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14,… ##$ ads < int > 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,… ## $ trend1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
Từ thống kê tóm tắt, bạn có thể thấy dữ liệu có giá trị lớn. Một phương pháp hay với k tính giá trị trung bình và khoảng cách là chia lại tỷ lệ dữ liệu sao cho giá trị trung bình bằng một và độ lệch chuẩn bằng 0.
summary(df)
Đầu ra:
## price speed hd ram## Min. : 949 Min. : 25.00 Min. : 80.0 Min. : 2.000## 1st Qu.:1794 1st Qu.: 33.00 1st Qu.: 214.0 1st Qu.: 4.000 `## Median :2144 Median : 50.00 Median : 340.0 Median : 8.000## Mean :2220 Mean : 52.01 Mean : 416.6 Mean : 8.287## 3rd Qu.:2595 3rd Qu.: 66.00 3rd Qu.: 528.0 3rd Qu.: 8.000## Max. :5399 Max. :100.00 Max. :2100.0 Max. :32.000## screen ads trend## Min. :14.00 Min. : 39.0 Min. : 1.00## 1st Qu.:14.00 1st Qu.:162.5 1st Qu.:10.00## Median :14.00 Median :246.0 Median :16.00## Mean :14.61 Mean :221.3 Mean :15.93## 3rd Qu.:15.00 3rd Qu.:275.0 3rd Qu.:21.50## Max. :17.00 Max. :339.0 Max. :35.00
Bạn bán lại các biến bằng hàm scale () của thư viện dplyr. Việc chuyển đổi làm giảm tác động của các giá trị ngoại lai và cho phép so sánh một quan sát duy nhất với giá trị trung bình. Nếu một giá trị chuẩn hóa (hoặc điểm số z ) cao, bạn có thể tin tưởng rằng quan sát này thực sự cao hơn giá trị trung bình (điểm số z lớn ngụ ý rằng điểm này cách xa giá trị trung bình về độ lệch chuẩn. A z- điểm của hai cho biết giá trị cách giá trị trung bình 2 độ lệch chuẩn. Lưu ý, điểm z tuân theo phân phối Gauss và đối xứng xung quanh giá trị trung bình.
rescale_df <- df % > %mutate(price_scal = scale(price),hd_scal = scale(hd),ram_scal = scale(ram),screen_scal = scale(screen),ads_scal = scale(ads),trend_scal = scale(trend)) % > %select(-c(price, speed, hd, ram, screen, ads, trend))
Cơ sở R có một chức năng để chạy thuật toán k trung bình. Chức năng cơ bản của k mean là:
kmeans(df, k)arguments:-df: dataset used to run the algorithm-k: Number of clusters
Đào tạo mô hình
Trong hình ba, bạn đã trình bày chi tiết cách thức hoạt động của thuật toán. Bạn có thể xem từng bước bằng đồ thị với gói tuyệt vời được xây dựng bởi Yi Hui (cũng là người tạo ra Knit cho Rmarkdown). Hoạt ảnh gói không có sẵn trong thư viện chung cư. Bạn có thể sử dụng cách khác để cài đặt gói với install.packages ("hoạt ảnh"). Bạn có thể kiểm tra xem gói đã được cài đặt trong thư mục Anaconda của chúng tôi chưa.
install.packages("animation")
Sau khi bạn tải thư viện, bạn thêm .ani sau kmeans và R sẽ vẽ sơ đồ tất cả các bước. Đối với mục đích minh họa, bạn chỉ chạy thuật toán với các biến được thay đổi tỷ lệ hd và ram với ba cụm.
set.seed(2345)library(animation)kmeans.ani(rescale_df[2:3], 3)
Giải thích mã
- kmeans.ani (rescale_df [2: 3], 3): Chọn cột 2 và 3 của tập dữ liệu rescale_df và chạy thuật toán với k bộ thành 3. Vẽ hoạt ảnh.
Bạn có thể giải thích hoạt ảnh như sau:
- Bước 1: R chọn ngẫu nhiên ba điểm
- Bước 2: Tính khoảng cách Euclide và vẽ các cụm. Bạn có một cụm màu xanh lá cây ở dưới cùng bên trái, một cụm lớn màu đen ở bên phải và một cụm màu đỏ ở giữa chúng.
- Bước 3: Tính trọng tâm, tức là giá trị trung bình của các cụm
- Lặp lại cho đến khi không có dữ liệu nào thay đổi cụm
Thuật toán hội tụ sau bảy lần lặp. Bạn có thể chạy thuật toán k-mean trong tập dữ liệu của chúng tôi với năm cụm và gọi nó là pc_cluster.
pc_cluster <-kmeans(rescale_df, 5)
- Danh sách pc_cluster chứa bảy phần tử thú vị:
- pc_cluster $ cluster: Cho biết cụm của mỗi quan sát
- pc_cluster $ center: Trung tâm cụm
- pc_cluster $ totss: Tổng bình phương
- pc_cluster $ withinss: Trong tổng bình phương. Số thành phần trả về bằng `k`
- pc_cluster $ tot.withinss: Tổng số lượng phù thủy
- pc_clusterbetweenss: Tổng bình phương trừ Trong tổng bình phương
- pc_cluster $ size: Số lượng quan sát trong mỗi cụm
Bạn sẽ sử dụng tổng trong tổng bình phương (tức là tot.withinss) để tính số cụm k tối ưu. Tìm k thực sự là một nhiệm vụ quan trọng.
Tối ưu k
Một kỹ thuật để chọn k tốt nhất được gọi là phương pháp khuỷu tay . Phương pháp này sử dụng tính đồng nhất trong nhóm hoặc tính không đồng nhất trong nhóm để đánh giá độ biến thiên. Nói cách khác, bạn quan tâm đến phần trăm phương sai được giải thích bởi mỗi cụm. Bạn có thể mong đợi sự thay đổi tăng lên với số lượng cụm, cách khác, tính không đồng nhất giảm. Thách thức của chúng tôi là tìm k nằm ngoài lợi nhuận giảm dần. Thêm một cụm mới không cải thiện sự thay đổi trong dữ liệu vì rất ít thông tin còn lại để giải thích.
Trong hướng dẫn này, chúng tôi tìm ra điểm này bằng cách sử dụng thước đo tính không đồng nhất. Tổng trong các cụm tổng của các ô vuông là tot.withinss trong danh sách được trả về bởi kmean ().
Bạn có thể xây dựng đồ thị khuỷu tay và tìm k tối ưu như sau:
- Bước 1: Xây dựng một hàm để tính tổng trong các cụm tổng các ô vuông
- Bước 2: Chạy thuật toán lần
- Bước 3: Tạo khung dữ liệu với kết quả của thuật toán
- Bước 4: Lập biểu đồ kết quả
Bước 1) Xây dựng một hàm để tính tổng trong các cụm tổng các ô vuông
Bạn tạo hàm chạy thuật toán k-mean và lưu trữ tổng trong các cụm tổng các ô vuông
kmean_withinss <- function(k) {cluster <- kmeans(rescale_df, k)return (cluster$tot.withinss)}
Giải thích mã
- function (k): Đặt số lượng đối số trong hàm
- kmeans (rescale_df, k): Chạy thuật toán k lần
- return (cluster $ tot.withinss): Lưu trữ tổng trong các cụm tổng các ô vuông
Bạn có thể kiểm tra hàm với bằng 2.
Đầu ra:
## Try with 2 cluster
kmean_withinss(2)
Đầu ra:
## [1] 27087.07
Bước 2) Chạy thuật toán n lần
Bạn sẽ sử dụng hàm sapply () để chạy thuật toán trên phạm vi k. Kỹ thuật này nhanh hơn việc tạo vòng lặp và lưu trữ giá trị.
# Set maximum clustermax_k <-20# Run algorithm over a range of kwss <- sapply(2:max_k, kmean_withinss)
Giải thích mã
- max_k <-20: Đặt số lượng tối đa là 20
- sapply (2: max_k, kmean_withinss): Chạy hàm kmean_withinss () trong phạm vi 2: max_k, tức là 2 đến 20.
Bước 3) Tạo khung dữ liệu với kết quả của thuật toán
Đăng bài tạo và thử nghiệm chức năng của chúng tôi, bạn có thể chạy thuật toán k-mean trong phạm vi từ 2 đến 20, lưu trữ các giá trị tot.withinss.
# Create a data frame to plot the graphelbow <-data.frame(2:max_k, wss)
Giải thích mã
- data.frame (2: max_k, wss): Tạo khung dữ liệu với đầu ra của thuật toán lưu trữ trong wss
Bước 4) Lập biểu đồ kết quả
Bạn vẽ biểu đồ để hình dung đâu là điểm khuỷu tay
# Plot the graph with gglopggplot(elbow, aes(x = X2.max_k, y = wss)) +geom_point() +geom_line() +scale_x_continuous(breaks = seq(1, 20, by = 1))
Từ biểu đồ, bạn có thể thấy k tối ưu là bảy, nơi đường cong bắt đầu có lợi tức giảm dần.
Khi bạn có k tối ưu của chúng tôi, bạn chạy lại thuật toán với k bằng 7 và đánh giá các cụm.
Kiểm tra cụm
pc_cluster_2 <-kmeans(rescale_df, 7)
Như đã đề cập trước đây, bạn có thể truy cập thông tin thú vị còn lại trong danh sách được trả về bởi kmean ().
pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size
Phần đánh giá là chủ quan và dựa vào việc sử dụng thuật toán. Mục tiêu của chúng tôi ở đây là tập hợp máy tính có các tính năng tương tự. Một anh chàng máy tính có thể thực hiện công việc bằng tay và nhóm máy tính dựa trên chuyên môn của mình. Tuy nhiên, quá trình này sẽ mất rất nhiều thời gian và dễ xảy ra lỗi. Thuật toán K-mean có thể chuẩn bị trường cho anh ấy / cô ấy bằng cách gợi ý các cụm.
Như một đánh giá trước, bạn có thể kiểm tra kích thước của các cụm.
pc_cluster_2$size
Đầu ra:
## [1] 608 1596 1231 580 1003 699 542
Cụm đầu tiên bao gồm 608 quan sát, trong khi cụm nhỏ nhất, số 4, chỉ có 580 máy tính. Có thể tốt nếu có sự đồng nhất giữa các cụm, nếu không, có thể cần chuẩn bị dữ liệu mỏng hơn.
Bạn có cái nhìn sâu hơn về dữ liệu với thành phần trung tâm. Các hàng đề cập đến số lượng của cụm và các cột mà các biến được sử dụng bởi thuật toán. Các giá trị là điểm trung bình của mỗi cụm cho cột quan tâm. Tiêu chuẩn hóa làm cho việc giải thích dễ dàng hơn. Các giá trị dương cho biết điểm số z cho một cụm nhất định cao hơn giá trị trung bình tổng thể. Ví dụ, cụm 2 có giá trung bình cao nhất trong số tất cả các cụm.
center <-pc_cluster_2$centerscenter
Đầu ra:
## price_scal hd_scal ram_scal screen_scal ads_scal trend_scal## 1 -0.6372457 -0.7097995 -0.691520682 -0.4401632 0.6780366 -0.3379751## 2 -0.1323863 0.6299541 0.004786730 2.6419582 -0.8894946 1.2673184## 3 0.8745816 0.2574164 0.513105797 -0.2003237 0.6734261 -0.3300536## 4 1.0912296 -0.2401936 0.006526723 2.6419582 0.4704301 -0.4132057## 5 -0.8155183 0.2814882 -0.307621003 -0.3205176 -0.9052979 1.2177279## 6 0.8830191 2.1019454 2.168706085 0.4492922 -0.9035248 1.2069855## 7 0.2215678 -0.7132577 -0.318050275 -0.3878782 -1.3206229 -1.5490909
Bạn có thể tạo bản đồ nhiệt với ggplot để giúp chúng tôi làm nổi bật sự khác biệt giữa các danh mục.
Màu mặc định của ggplot cần được thay đổi bằng thư viện RColorBrewer. Bạn có thể sử dụng thư viện chung cư và mã để khởi chạy trong thiết bị đầu cuối:
conda cài đặt -cr r-rcolorbrewer
Để tạo bản đồ nhiệt, bạn tiến hành theo ba bước:
- Xây dựng khung dữ liệu với các giá trị của trung tâm và tạo một biến với số lượng của cụm
- Định hình lại dữ liệu bằng hàm collect () của thư viện sắp xếp gọn gàng hơn. Bạn muốn chuyển đổi dữ liệu từ rộng sang dài.
- Tạo bảng màu với hàm colorRampPalette ()
Bước 1) Xây dựng khung dữ liệu
Hãy tạo tập dữ liệu định hình lại
library(tidyr)# create dataset with the cluster numbercluster <- c(1: 7)center_df <- data.frame(cluster, center)# Reshape the datacenter_reshape <- gather(center_df, features, values, price_scal: trend_scal)head(center_reshape)
Đầu ra:
## cluster features values## 1 1 price_scal -0.6372457## 2 2 price_scal -0.1323863## 3 3 price_scal 0.8745816## 4 4 price_scal 1.0912296## 5 5 price_scal -0.8155183## 6 6 price_scal 0.8830191
Bước 2) Định hình lại dữ liệu
Đoạn mã dưới đây tạo bảng màu mà bạn sẽ sử dụng để vẽ bản đồ nhiệt.
library(RColorBrewer)# Create the palettehm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')
Bước 3) Hình dung
Bạn có thể vẽ biểu đồ và xem các cụm trông như thế nào.
# Plot the heat mapggplot(data = center_reshape, aes(x = features, y = cluster, fill = values)) +scale_y_continuous(breaks = seq(1, 7, by = 1)) +geom_tile() +coord_equal() +scale_fill_gradientn(colours = hm.palette(90)) +theme_classic()
Tóm lược
Chúng ta có thể tóm tắt thuật toán k-mean trong bảng dưới đây
Gói hàng |
Mục tiêu |
chức năng |
tranh luận |
---|---|---|---|
căn cứ |
Train k-mean |
kmeans () |
df, k |
Cụm truy cập |
kmeans () $ cluster | ||
Trung tâm cụm |
kmeans () $ center | ||
Cụm kích thước |
kmeans () $ size |