Xác định các cụm người nổi tiếng Nhóm hoặc nhóm Nhóm trong một ma trận


7

Tôi có một ma trận được điền với các phần tử rời rạc và tôi cần phân cụm chúng (sử dụng R) thành các nhóm nguyên vẹn. Vì vậy, ví dụ, lấy ma trận này:

[A B B C A]  
[A A B A A]  
[A B B C C]  
[A A A A A]  

Sẽ có hai cụm riêng cho A, hai cụm riêng cho C và một cụm cho B.

Đầu ra mà tôi đang tìm sẽ lý tưởng chỉ định một ID duy nhất cho mỗi cụm, đại loại như thế này:

[1 2 2 3 4]  
[1 1 2 4 4]  
[1 2 2 5 5]  
[1 1 1 1 1]

Ngay bây giờ tôi đã viết một mã thực hiện điều này một cách đệ quy bằng cách lặp đi lặp lại kiểm tra hàng xóm gần nhất, nhưng nó nhanh chóng tràn ra khi ma trận trở nên lớn (ví dụ: 100x100).

Có một chức năng tích hợp trong R có thể làm điều này? Tôi nhìn vào raster và xử lý hình ảnh, nhưng không có may mắn. Tôi tin rằng nó phải ở ngoài đó.


Câu trả lời:


2

Bạn nghĩ gì về đo khoảng cách trong trường hợp của bạn?

Tôi giả sử có ba chiều ở đây:

  • RowN (số lượng hàng)
  • ColN (số cột)
  • Value (giá trị: A, B hoặc C)

Điều đó có nghĩa là dữ liệu bạn nhận được từ 4x5ma trận trông giống như:

Sample1 -> (1, 1, A)
Sample2 -> (1, 2, B)
...
Sample5 -> (1, 5, A)
Sample6 -> (2, 1, A)
...
Sample15 -> (3, 5, C)
...
Sample20 -> (4, 5, A)

valuethu nhỏ? Nói cách khác, là A < B < C?

Nếu có, thì

  • bạn có thể thay thế {A, B, C}bằng {0, 1, 2}(hoặc có thể {10, 11, 12}, nếu bạn muốn sự khác biệt này ít quan trọng hơn các thuộc tính RowN và ColN)
  • bình thường hóa dữ liệu của bạn
  • sử dụng, ví dụ: thuật toán phân cụm K-Means ( http://stat.ethz.ch/R-manual/R-patched/l Library / stat / html / kmeans.html ) từ statsgói R

Trong trường hợp đó, khoảng cách giữa hai sẽ là:

Sqrt( (RowN1-RowN2)^2 + (ColN1-ColN2)^2 + (Value1-Value2)^2 )

Nếu valuekhông được chia tỷ lệ (biến phân loại thông thường), hãy sử dụng một số sửa đổi của K-Means hoạt động với dữ liệu phân loại .

Vì vậy, trong trường hợp ma trận 100x100, bạn có 10000 quan sát và ba biến, đó là cỡ mẫu khá nhỏ.


1

Tôi không chắc chắn nếu câu hỏi của bạn phân loại là một vấn đề phân cụm. Trong phân cụm, bạn đang cố gắng khám phá các cụm ví dụ tương tự bằng cách sử dụng dữ liệu không ghi nhãn. Ở đây, có vẻ như bạn muốn liệt kê các "cụm" hiện có của các nút gần đó.

Thành thật mà nói, tôi không có ý tưởng nào về chức năng như vậy trong R. Nhưng, theo như thuật toán có liên quan, tôi tin rằng những gì bạn đang tìm kiếm là Ghi nhãn thành phần được kết nối . Loại của một xô đầy, cho ma trận.

Bài viết trên wikipedia được liên kết ở trên. Một trong những thuật toán được trình bày ở đó, được gọi là thuật toán một lần, như sau:

One-Pass(Image)
        [M, N]=size(Image);
        Connected = zeros(M,N);
        Mark = Value;
        Difference = Increment;
        Offsets = [-1; M; 1; -M];
        Index = [];
        No_of_Objects = 0; 

   for i: 1:M :
       for j: 1:N:
            if(Image(i,j)==1)            
                 No_of_Objects = No_of_Objects +1;            
                 Index = [((j-1)*M + i)];           
                 Connected(Index)=Mark;            
                 while ~isempty(Index)                
                      Image(Index)=0;                
                      Neighbors = bsxfun(@plus, Index, Offsets');
                      Neighbors = unique(Neighbors(:));                
                      Index = Neighbors(find(Image(Neighbors)));                                
                      Connected(Index)=Mark;
                 end            
                 Mark = Mark + Difference;
            end
      end
  end

Tôi đoán thật dễ dàng để tự cuộn bằng cách sử dụng ở trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.