Showing posts with label Cơ sở dữ liệu. Show all posts
Showing posts with label Cơ sở dữ liệu. Show all posts

Wednesday, June 26, 2013

Thuật toán K-Mean trong bài toán Phân cụm dữ liệu

I.  GIỚI THIỆU
    Thuật toán K-means clustering do MacQueen giới thiệu trong tài liệu “J. Some Methods for Classification and Analysis of Multivariate Observations” năm 1967.
K-means Clustering là một thuật toán dùng trong các bài toán phân loại/nhóm n đối tượng thành k nhóm dựa trên đặc tính/thuộc tính của đối tượng (k £n nguyên, dương).
Về nguyên lý, có n đối tượng, mỗi đối tượng có m thuộc tính, ta phân chia được các đối tượng thành k nhóm dựa trên các thuộc tính của đối tượng bằng việc áp dụng thuật toán này.
Coi mỗi thuộc tính của đối tượng (đối tượng có m thuộc tính) như một toạ độ của không gian m chiều và biểu diễn đối tượng như một điểm của không gian m chiều.
ai =( xi1, xi2, ... xim)                   ( 1)
ai (i=1..n) - đối tượng thứ i
xij (i=1..n, j=1..m) - thuộc tính thứ j của đối tượng i
Phương thức phân loại/nhóm dữ liệu thực hiện dựa trên khoảng cách Euclidean nhỏ nhất giữa đối tượng đến phần tử  trung tâm của các nhóm.
Phần tử trung tâm của nhóm được xác định bằng giá trị trung bình các phần tử trong nhóm.
2. Khoảng cách Euclidean.
   ai=(xi1, xi2,... xim) i=1..n - đối tượng thứ i cần phân phân loại
cj=(xj1, xj2,... xjm) j=1..k - phần tử trung tâm nhóm j
Khoảng cách Euclidean từ đối tượng ai đến phần tử trung tâm nhóm j cj được tính toán dựa trên công thức:
    


( 2)

dji - khoảng cách Euclidean từ ai đến cj
xis - thuộc tính thứ s của đối tượng ai
xjs - thuộc tính thứ s của phần tử trung tâm cj

3. Phần tử trung tâm.
k phần tử trung tâm (k nhóm) ban đầu được chọn ngẫu nhiên, sau mỗi lần nhóm các đối tượng vào các nhóm, phần tử trung tâm được tính toán lại.
Clusteri = {a1, a2 .... at} – Nhóm thứ i
i=1..k,  k số cluster
j= 1..m,  m số thuộc tính
t - số phần tử hiện có của nhóm thứ i
xsj - thuộc tính thứ j của phần tử s   s=1..t
cij - toạ độ thứ j của phần tử trung tâm nhóm i;
                     


( 3)


II. GIỚI THIỆU VỀ THUẬT TOÁN K-MEANS.
Sơ đồ thuật toán:


Hình 3:  Sơ đồ thuật toán K-means clustering

Thuật toán k-means bao gồm các bước cơ bản sau :
Input: Số cụm k và các trọng tâm cụm {mj}kj=1.
Output: Các cụm C[i] (1  ≤  i  ≤  k) và hàm tiêu chuẩn E đạt giá trị tối thiểu.
Begin
Bước 1: Khởi tạo
Chọn k trọng tâm {mj}kj=1 ban đầu trong không gian Rd (d là số chiều của dữ liệu). Việc lựa chọn này có thể là ngẫu nhiên hoặc theo kinh nghiệm.
Bước 2: Tính toán khoảng cách
Đối với mỗi điểm Xi  (1 ≤ i ≤ n), tính toán khoảng cách của nó tới mỗi trọng tâm mj (1 ≤ j ≤  k). Sau đó tìm trọng tâm gần nhất đối với mỗi điểm.
Bước 3: Cập nhật lại trọng tâm
Đối với mỗi 1 ≤ j ≤ k, cập nhật trọng tâm cụm mj  bằng cách xác định trung bình cộng các vectơ đối tượng dữ liệu.
Điều kiện dừng:
Lặp lại các bước 2 và 3 cho đến khi các trọng tâm của cụm không thay đổi.
End.

Thuật toán k-means trên được chứng minh là hội tụ và có độ phức tạp tính toán là: 

 Trong đó, n là số đối tượng dữ liệu, k là số cụm dữ liệu, d là số chiều, τ là số vòng lặp, Tflop là thời gian để thực hiện một phép tính cơ sở như phép tính nhân, chia,... Như vậy, do k-means phân tích phân cụm đơn giản nên có thể áp dụng đối với tập dữ liệu lớn.Tuy nhiên, nhược điểm của k-means là chỉ áp dụng với dữ liệu có thuộc tính số và khám phá ra các cụm có dạng hình cầu, k-means còn rất nhạy cảm với nhiễu và các phần tử ngoại lai trong dữ liệu. Hơn nữa, chất lượng phân cụm dữ liêuk của thuật toán k-means phụ thuộc nhiều vào các tham số đầu vào như: số cụm k và k trọng tâm khởi tạo ban đầu. Trong trường hợp các trọng tâm khởi tạo ban đầu mà quá lệch so với các trọng tâm cụm tự nhiên thì kết quả phân cụm của k-means là rất thấp, nghĩa là các cụm dữ liệu được khám phá rất lệch so với các cụm trong thực tế. Trên thực tế chưa có một giải pháp tối ưu nào để chọn các tham số đầu vào, giải pháp thường được sử dụng nhất là thử nghiệm với các giá trị đầu vào k khác nhau rồi sau đó chọn giải pháp tốt nhất.



III. CHƯƠNG TRÌNH DEMO.
Chương trình gồm các Hàm chính:
·        kMeanCluster– Thể hiện một đối tượng
·        dist – Đối tượng trung tâm

Sub kMeanCluster(Data() As Variant, numCluster As Integer)
Dim i As Integer
Dim j As Integer
Dim X As Single
Dim Y As Single
Dim min As Single
Dim cluster As Integer
Dim d As Single
Dim sumXY()
Dim isStillMoving As Boolean
isStillMoving = True
If totalData <= numCluster Then
    Data(0, totalData) = totalData               ' cluster No = total data
    Centroid(1, totalData) = Data(1, totalData)  ' X
    Centroid(2, totalData) = Data(2, totalData)  ' Y
Else                    'calculate minimum distance to assign the new data
    min = 10 ^ 10                                'big number
    X = Data(1, totalData)
    Y = Data(2, totalData)
    For i = 1 To numCluster
        d = dist(X, Y, Centroid(1, i), Centroid(2, i))
        If d < min Then
            min = d
            cluster = i
        End If
    Next i
    Data(0, totalData) = cluster
   
    Do While isStillMoving
    ' this loop will surely convergent        calculate new centroids
   ReDim sumXY(1 To 3, 1 To numCluster) '1=X,2=Y,3=count number of data
        For i = 1 To totalData
            sumXY(1, Data(0, i)) = Data(1, i) + sumXY(1, Data(0, i))
            sumXY(2, Data(0, i)) = Data(2, i) + sumXY(2, Data(0, i))
            sumXY(3, Data(0, i)) = 1 + sumXY(3, Data(0, i))
        Next i
        For i = 1 To numCluster
            Centroid(1, i) = sumXY(1, i) / sumXY(3, i)
            Centroid(2, i) = sumXY(2, i) / sumXY(3, i)
        Next i
        'assign all data to the new centroids
        isStillMoving = False
        For i = 1 To totalData
            min = 10 ^ 10                                'big number
            X = Data(1, i)
            Y = Data(2, i)
            For j = 1 To numCluster
                d = dist(X, Y, Centroid(1, j), Centroid(2, j))
                If d < min Then
                    min = d
                    cluster = j
                End If
            Next j
            If Data(0, i) <> cluster Then
                Data(0, i) = cluster
                isStillMoving = True
            End If
        Next i
    Loop
End If

End Sub


Function dist(X1 As Single, Y1 As Single, X2 As Single, Y2 As Single) As Single
' calculate Euclidean distance
    dist = Sqr((Y2 - Y1) ^ 2 + (X2 - X1) ^ 2)

End Function


Private Function min2(num1, num2)
' return minimum value between two numbers
    If num1 < num2 Then
        min2 = num1
    Else
        min2 = num2
    End If

End Function




>> DOWNLOAD CODE TẠI ĐÂY

KẾ QUẢ CHƯƠNG TRÌNH
Dữ liệu vào
    Data(1, 1) = 1
    Data(2, 1) = 1
   
    Data(1, 2) = 5
    Data(2, 2) = 2
   
    Data(1, 3) = 8
    Data(2, 3) = 5
   
    Data(1, 4) = 7
    Data(2, 4) = 3
       
    Data(1, 5) = 5
    Data(2, 5) = 1

Kết quả chạy với k= 3





Kết quả chạy với k= 2


Giống như các thuật toán khác, k- mean cũng có một số hạn chế nhất định:
-         Việc khởi tạo phần tử trung tâm của nhóm ban đầu ảnh hưởng đến sự phân chia đối tượng vào nhóm trong trường hợp dữ liệu không lớn.
-         Số nhóm k luôn phải được xác định trước.
-         Không xác định được rõ ràng vùng của nhóm, cùng 1 đối tượng, nó có thể được đưa vào nhóm này hoặc nhóm khác khi dung lượng dữ liệu thay đổi.
-         Điều kiện khởi tạo có ảnh hưởng lớn đến kết quả. Điều kiện khởi tạo khác nhau có thể cho ra kết quả phân vùng nhóm khác nhau.
-         Không xác định được mức độ ảnh hưởng của thuộc tính đến quá trình tạo nhóm.
Như vậy, với dữ liệu nhỏ, thuật toán có thể có những hạn chế. Để khắc phục những hạn chế này, nên sử dụng thuật toán kmean trong trường hợp dữ liệu lớn.
Về vấn đề hạn chế phân nhóm, có thể dùng phương pháp xác định trung tuyến thay vì xác định mean.

Một quan niệm cho rằng k-means không thể dùng cho dữ liệu có kiểu là định lượng. Điều này không đúng, k-means có thể được dùng giải quyết các bài toán dữ liệu đa biến, thậm chí cho các bài toán có nhiều dạng dữ liệu. Chìa khoá cho việc giải bài toán này của k-means là sử dụng ma trận khoảng cách.

TÀI LIỆU THAM KHẢO

1.      Bài giảng của thầy Nguyễn Bá Tường
2.      k-means clustering http://en.wikipedia.org/wiki/K-means_clustering
3.      How the K-Mean Clustering algorithm works? http://people.revoledu.com/kardi/tutorial/kMean/Algorithm.htm
4.      Kiri Wagstaff, Claire Cardie; Constrained k-means clustering with Background Knowledge http://www.cse.msu.edu/~cse802/notes/ConstrainedKmeans.pdf

[TxT]

Wednesday, May 22, 2013

Cây quyết định với bài toán phân loại dữ liệu

Khái niệm cây quyết định

Trong lĩnh vực học máy, cây quyết định là một kiểu mô hình dự báo (predictive model), nghĩa là một ánh xạ từ các quan sát về một sự vật/hiện tượng tới các kết luận về giá trị mục tiêu của sự vật/hiện tượng. Mỗi một nút trong (internal node) tương ứng với một biến; đường nối giữa nó với nút con của nó thể hiện một giá trị cụ thể cho biến đó. Mỗi nút lá đại diện cho giá trị dự đoán của biến mục tiêu, cho trước các giá trị của các biến được biểu diễn bởi đường đi từ nút gốc tới nút lá đó. Kỹ thuật học máy dùng trong cây quyết định được gọi là học bằng cây quyết định, hay chỉ gọi với cái tên ngắn gọn là cây quyết định.

Hình minh họa

Học bằng cây quyết định cũng là một phương pháp thông dụng trong khai phá dữ liệu. Khi đó, cây quyết định mô tả một cấu trúc cây, trong đó, các lá đại diện cho các phân loại còn cành đại diện cho các kết hợp của các thuộc tính dẫn tới phân loại đó[1]. Một cây quyết định có thể được học bằng cách chia tập hợp nguồn thành các tập con dựa theo một kiểm tra giá trị thuộc tính . Quá trình này được lặp lại một cách đệ qui cho mỗi tập con dẫn xuất. Quá trình đệ qui hoàn thành khi không thể tiếp tục thực hiện việc chia tách được nữa, hay khi một phân loại đơn có thể áp dụng cho từng phần tử của tập con dẫn xuất. Một bộ phân loại rừng ngẫu nhiên (random forest) sử dụng một số cây quyết định để có thể cải thiện tỉ lệ phân loại.

Cây quyết định cũng là một phương tiện có tính mô tả dành cho việc tính toán các xác suất có điều kiện.

Cây quyết định có thể được mô tả như là sự kết hợp của các kỹ thuật toán học và tính toán nhằm hỗ trợ việc mô tả, phân loại và tổng quát hóa một tập dữ liệu cho trước.
Dữ liệu được cho dưới dạng các bản ghi có dạng: (x, y) = (x1, x2, x3..., xk, y)

Biến phụ thuộc (dependant variable) y là biến mà chúng ta cần tìm hiểu, phân loại hay tổng quát hóa. x1, x2, x3 ... là các biến sẽ giúp ta thực hiện công việc đó

Cây quyết định còn có hai tên khác:
- Cây hồi quy (Regression tree) ước lượng các hàm giá có giá trị là số thực thay vì được sử dụng cho các nhiệm vụ phân loại. (ví dụ: ước tính giá một ngôi nhà hoặc khoảng thời gian một bệnh nhân nằm viện)
- Cây phân loại (Classification tree), nếu y là một biến phân loại như: giới tính (nam hay nữ), kết quả của một trận đấu (thắng hay thua).
Ví dụ: Ta có dữ liệu (training data) về 10 đối tượng (người). Mỗi đối tượng được mô tả bởi 4 thuộc tính là Gender, Car Ownership, Travel Cost/Km, Income Level và 1 thuộc tính phân loại (category attribute) là Transportation mode. Trong đó thuộc tính Gender có kiểu binary, thuộc tính Car Ownership có kiểu Quantitative integer (0,1), Travel Cost/Km và Income Level có kiểu dữ liệu Ordinal.
Tranining data cho biết sự lựa chọn về loại phương tiện vận chuyển (car, bus, train) của khách dựa vào 4 thuộc tính đã cho (xem bảng).

Bảng 1


Dựa vào Training Data ở trên, chúng ta có thể tạo ra cây quyết định như sau


Hình 1: Ví dụ cây quyết đình

Chú ý rằng trong cây quyết định trên, thuộc tính “Income Level” không xuất hiện trong cây bởi vì dựa vào training data đã cho, thuộc tính “Travel Cost/Km”  sẽ sinh ra cây quyết định tốt dùng để phân loại tốt hơn “Income Level”
Làm sao để sử dụng cây quyết định trong dự đoán lớp của các dữ liệu chưa biết ?
Mục đích chính của cây quyết định là dùng để dự đoán lớp (xác định lớp) của các đối tượng chưa biết (unseen data). Giả sử rằng ta có dữ liệu về 3 người với các giá trị dữ liệu đã biết về các thuộc tính Gender, Car Ownership, Travel Cost/Km, Income Level. Tuy nhiên ta chưa biết họ sẽ chọn phương tiện vận chuyển nào (Car, Bus, Train). Nhiệm vụ của chúng ta là sử dụng cây quyết định đã tạo ra để dự đoán (predict) Alex, Buddy và Cherry sẽ chọn phương tiện vận chuyển nào dựa vào 4 thuộc tính của họ. Dữ liệu dưới đây còn được gọi là Testing Data.

Bảng 2


Chúng ta bắt đầu từ node gốc của cây (root node) từ thuộc tính Travel Cost/Km, ta thấy rằng nếu Travel Cost/Km là Expensive thì người đó sẽ chọn phương tiện là Car. Nếu Travel Cost/Km là standard thì họ sẽ chọn phương tiện vận chuyển là Train. Nếu Travel Cost/Km làCheap thì cây quyết định cần tới giá trị của trường Gender của người đó, nếu Gender là Male thì chọn Bus, nếu giới tính là Female thì cây quyết định cần kiểm tra xem người đó có sử hữu bao nhiêu xe hơi (Car Ownership). Nếu số xe hơi sở hữu là 0 thì người đó sẽ chọn xeBus, nếu số xe hơi sở hữu là 1 thì người đó sẽ chọn Train.

Theo cây quyết định trên, các luật (Series of Rules) được sinh ra từ cây quyết định dùng để dự đoán như sau:

Rule 1 : If Travel cost/km is expensive then mode = car
Rule 2 : If Travel cost/km is standard then mode = train
Rule 3 : If Travel cost/km is cheap and gender is male then mode = bus
Rule 4 : If Travel cost/km is cheap and gender is female and she owns no car then mode = bus
Rule 5 : If Travel cost/km is cheap and gender is female and she owns 1 car then mode = train

Dựa vào các luật này, việc dự đoán lớp cho các dữ liệu chưa biết (unseen data hay Testing data) rất đơn giản. Trong ví dụ này, Alex có giá trị của thuộc tính Travel Cost/Km là Standard nên sẽ chọn phương tiện là Train (Rule 2) mà không cần quan tâm đến các thuộc tính khác của Alex. Buddy có giá trị của thuộc tính Travel Cost/Kmlà Cheap và Gender của anh ta là Male nên anh ta sẽ chọn Bus (Rule 3). Cheery cũng có giá trị thuộc tính Travel Cost/Km làCheap nhưng Gender là Female và sở hữu 1 xe hơi cho nên theo cây quyết định trên (Rule 5) cô ta sẽ chọn phương tiện là Train.

Kết quả phân lớp bằng cây quyết định như sau:

Bảng 3


 Cây quyết định là một phương pháp phân lớp rất hiệu quả và dễ hiểu. Tuy nhiên có một số chú ý khi sử dụng cây quyết định trong xây dựng các mô hình phân lớp như sau:

Hiệu của phân lớp của cây quyết định (Series of Rules) phụ thuộc rất lớn vào training data. Chẳn hạn cây quyết định được tạo ra bởi chỉ giới hạn 10 samples training data trong ví dụ trên thì hiệu quả ứng dụng cây quyết định để dự đoán các trường hợp khác là không cao (thường training data phải đủ lớn và tin cậy) và vì vậy ta không thể nói rằng tập các luật (Series of Rules) được sinh ra bở cây quyết định trên là tập luật tốt nhất.

Một số thuật toán học cây quyết định tiêu biểu

Có rất nhiều thuật toán phân lớp như ID3, J48, C4.5, CART (Classification and Regression Tree),… Việc chọn thuật toán nào để có hiệu quả phân lớp cao tuy thuộc vào rất nhiều yếu tố, trong đó cấu trúc dữ liệu ảnh hưởng rất lớn đến kết quả của các thuật toán. Chẳn hạn như thuật toán ID3 và CART cho hiệu quả phân lớp rất cao đối với các trường dữ liệu số (quantitative value) trong khi đó các thuật toán như J48, C4.5 có hiệu quả hơn đối với các dữ liệu Qualititive value (ordinal, Binary, nominal).

Một số tool demo thuật toán Cây quyết định

1. weka: Tool được sử dụng phổ biến, hoàn toàn miễn phí, được viết bằng Java
  [Tải tool về máy - Lưu ý: Sau 5s, click Bỏ qua quảng cáo (Skip Ad)]

2. Clus: Tool mới xây dựng, hoàn toàn miễn phí, được viết bằng Java
  [Tải tool về máy - Lưu ý: Sau 5s, click Bỏ qua quảng cáo (Skip Ad)]

(TxT)

Ví dụ mảng 2 chiều [C/C++]

BAI TAP MANG 2 CHIEU - 29.11.19 /* Viết các hàm thực hiện 1.Nhập vào từ bàn phím ma trận vuông chứa các số nguyên có kích thước n (3...