17

Tôi đang làm một trang web cộng đồng yêu cầu tôi tính toán sự giống nhau giữa hai người dùng bất kỳ. Mỗi người dùng được mô tả với các thuộc tính sau:Cách tính tương tự

tuổi, loại da (dầu, khô), loại tóc (dài, ngắn, trung bình), lối sống (người yêu hoạt động ngoài trời, TV junky) và những người khác.

Bất cứ ai có thể cho tôi biết cách giải quyết vấn đề này hoặc chỉ cho tôi một số tài nguyên?

+2

liên quan: http://stackoverflow.com/questions/3007790/finding-the-closest-match/3007816#3007816 – Betamoo

Trả lời

2

Bạn có lẽ nên có một cái nhìn cho

Thes chủ đề e sẽ cho bạn chương trình của bạn nhận ra điểm tương đồng và cụm trong bộ sưu tập người dùng của bạn và cố gắng thích ứng với họ ...

Sau đó bạn có thể biết khác nhau ẩn nhóm chung của người sử dụng có liên quan ... (tức là người dùng với tóc màu xanh lá cây thường không thích xem TV ..)

Như một lời khuyên, hãy cố gắng sử dụng các công cụ thực hiện đã sẵn sàng cho tính năng này thay vì thực hiện điều đó cho mình ...
Hãy xem Open Directory Data Mining Projects

3

cho mỗi thuộc tính một trọng lượng thích hợp và thêm sự khác biệt giữa các giá trị.

enum SkinType 
    Dry, Medium, Oily 

enum HairLength 
    Bald, Short, Medium, Long 

UserDifference(user1, user2) 
    total := 0 
    total += abs(user1.Age - user2.Age) * 0.1 
    total += abs((int)user1.Skin - (int)user2.Skin) * 0.5 
    total += abs((int)user1.Hair - (int)user2.Hair) * 0.8 
    # etc... 
    return total 

Nếu bạn thực sự cần tương thay vì sự khác biệt, sử dụng 1/UserDifference(a, b)

0

Nhìn vào các thuật toán để tính toán sự khác biệt srting. Nó rất giống với những gì bạn cần. Lưu trữ các thuộc tính của bạn dưới dạng chuỗi bit và tính toán khoảng cách giữa các chuỗi

14

Cách tính toán khác (trong R) tất cả các khác biệt theo cặp (khoảng cách) giữa các quan sát trong tập dữ liệu. Các biến ban đầu có thể là các loại hỗn hợp. Việc xử lý dữ liệu nhị phân đối xứng danh nghĩa, thứ tự và (a) bằng cách sử dụng hệ số tương đồng chung của Gower (Gower, J. C. (1971) Một hệ số chung tương tự và một số thuộc tính của nó, Biometrics 27, 857–874). Để biết thêm thông tin, hãy truy cập this on page 47. Nếu x chứa bất kỳ cột nào trong các loại dữ liệu này, hệ số của Gower sẽ được sử dụng làm chỉ số.

Ví dụ

x1 <- factor(c(10, 12, 25, 14, 29)) 
x2 <- factor(c("oily", "dry", "dry", "dry", "oily")) 
x3 <- factor(c("medium", "short", "medium", "medium", "long")) 
x4 <- factor(c("active outdoor lover", "TV junky", "TV junky", "active outdoor lover", "TV junky")) 
x <- cbind(x1,x2,x3,x4) 

library(cluster) 
daisy(x, metric = "euclidean") 

bạn sẽ nhận được:

Dissimilarities : 
     1  2  3  4 
2 2.000000       
3 3.316625 2.236068     
4 2.236068 1.732051 1.414214   
5 4.242641 3.741657 1.732051 2.645751 

Nếu bạn quan tâm về một phương pháp để giảm chiều cho dữ liệu phân loại (cũng là một cách để sắp xếp các biến thành cụm đồng nhất) kiểm tra this

+0

'“khoảng cách Gower của”được lựa chọn bởi số liệu "gower "hoặc tự động nếu một số cột của x không phải là số' (? cluster :: daisy), do đó bạn không phải chuyển' metric' - đây là điều khó hiểu. –

1

Ba bước để đạt được một chỉ số chủ quan đơn giản cho sự khác biệt giữa hai datapoints có thể hoạt động tốt trong cas của bạn e:

  1. Ghi lại tất cả các biến trong biến số đại diện, ví dụ: loại da (oily = -1, dry = 1), kiểu tóc (long = 2, short = 0, medium = 1), lối sống (người yêu hoạt động ngoài trời = 1, TV junky = -1), tuổi là một số.
  2. Quy mô tất cả các dải số để chúng phù hợp với tầm quan trọng tương đối mà bạn cung cấp cho chúng để cho biết sự khác biệt. Ví dụ: Sự khác biệt về độ tuổi của 10 năm là khác nhau như sự khác biệt giữa tóc dài và trung bình, và sự khác biệt giữa da nhờn và da khô. Vì vậy, 10 trên quy mô tuổi là khác nhau như 1 trên quy mô tóc là khác nhau như 2 trên quy mô da, do đó, quy mô sự khác biệt trong độ tuổi bằng 0,1, rằng trong tóc của 1 và và trong da bằng 0,5
  3. sử dụng một thích hợp distance metric để kết hợp sự khác biệt giữa hai người trên các thang khác nhau trong một sự khác biệt ngang. Con số này càng nhỏ, chúng càng giống nhau. Tôi muốn đề xuất sự khác biệt bậc hai đơn giản như là một nỗ lực đầu tiên tại chức năng khoảng cách của bạn.

Sau đó, sự khác biệt giữa hai người có thể được tính với (tôi giả sử Person.age, .skin, .hair vv đã trải qua bước 1 và số):

double Difference(Person p1, Person p2) { 

    double agescale=0.1; 
    double skinscale=0.5; 
    double hairscale=1; 
    double lifestylescale=1; 

    double agediff = (p1.age-p2.age)*agescale; 
    double skindiff = (p1.skin-p2.skin)*skinscale; 
    double hairdiff = (p1.hair-p2.hair)*hairscale; 
    double lifestylediff = (p1.lifestyle-p2.lifestyle)*lifestylescale; 

    double diff = sqrt(agediff^2 + skindiff^2 + hairdiff^2 + lifestylediff^2); 
    return diff; 
} 

Note sự khác biệt trong ví dụ này không nằm trên thang điểm đẹp như (0..1). Giá trị của nó có thể dao động từ 0 (không có sự khác biệt) cho một cái gì đó lớn (sự khác biệt cao). Ngoài ra, phương pháp này gần như hoàn toàn không khoa học, nó chỉ được thiết kế để nhanh chóng cung cấp cho bạn một số liệu khác biệt làm việc.

Các vấn đề liên quan