Bảng 1: Mã gỉa thuật toán được đề xuất
Điều kiện dừng có thể là:
a[i][j] ← 0 i,j s[i][j] ←
i,j
While điều kiện hội tụ không thoả mãn
for each i,k
tìm k'≠k làm cực đại a[i][k']+s[i][k'] r[i][k] ← s[i][k]-(a[i][k']+s[i][k']) sum ← 0;
for each i' ∉{i,k} if r[i'][k]>0 then
do sum ← sum+r[i'][k] end if
end for
if (i==k)
then a[i][k] ← sum else if (r[k][k]+sum) <0
then a[i][k] ← r[k][k]+sum else a[i][k] ← 0 end if end if end for for each i Tìm k để a[i][k]+r[i][k] lớn nhất Thiết lập k như là hình mẫu của i Đặt điểm i vào cụm của k
end for end while
- Sau một số lần nhất định lặp đi lặp lại.
- Các thay đổi của tất cả các giá trị thông điệp trong một lần lặp nhỏ hơn một ngưỡng.
- Các hình mẫu không thay đổi sau một số lần lặp.
Đầu vào:
- Tập dữ liệu đầu vào X
- Số điểm dữ liệu N, số chiều r
- Ngưỡng , số bước lặp MaxStep
Đầu ra:
Cụm dữ liệu { sao cho thỏa mãn: =arg
Các bƣớc chạy thuật toán
Bước 1:
- Tính giá trị S(i,j) theo công thức tính khoảng cách euclide và lấy đối
2
) ,
(i j xi xj
s , i j (i, j từ 1=> N) - Set giá trị cho a(i,j) = 0 (i, j = 1=> N)
- Set các giá trị a(i,j) = S(i,j) = R(i,j) = khuyên nếu i = j
Bước 2: Bắt đầu chạy trong vòng lặp - Update hệ số { , } 2.1: Tìm k sao cho a(i,k) + s(i,k) đạt giá trị max
2.2: Tính r(i,j) theo công thức: r(i, j) = s(i, j) - (a(i, k) + s(i, k)) với (i, j từ 1=> N), k là các giá trị tìm được ở bước 2.1
2.3: Tính toán: Gán sum =0
- Tính tiếp:
if i = j then a(i, j) = sum else if (r(j, j) + sum) < 0 then a(i, j) = r(j, j) + sum else
a(i, j) = 0
2.4: Tính toán at1; rt1theo công thức có tham số lamda: Rnext(i, j) = lamda * R(i, j) + (1 - lamda) * Rnext(i, j) anext(i, j) = lamda * a(i, j) + (1 - lamda) * anext(i, j) 2.5: Cập nhật lại a= a.next; R = R.next
Kết thúc vòng lặp Bước 3: Xác định cụm
Xác định các exampler cho từng điểm bằng cách tìm k sao cho:
a(i,k) + s(i,k) đạt giá trị max (tính toán giống bước B1, chỉ khác là a đã được cập nhật lại ở cuối vòng lặp)