5

Tôi đang cố tạo một hệ thống giới thiệu đơn giản bằng knn.Xử lý dữ liệu chưa đầy đủ (dữ liệu thưa thớt) trong kNN

phép nói rằng tôi có một số một bảng:

User | Book1 | Book2 | Book3 | Book4 | Book5 | Book6 | Book7 | 
1 | 5  | ?  | 3  | ?  | 4  | 3  | 2  | 
2 | 3  | 4  | ?  | 2  | 3  | 4  | 2  | 
3 | 4  | 2  | 1  | ?  | ?  | 3  | 3  | 
4 | 2  | 5  | 3  | ?  | 4  | 1  | 1  | 
5 | 1  | 1  | 4  | 3  | 1  | ?  | 1  | 
6 | 5  | 2  | 5  | 4  | 4  | 2  | ?  | 

Vì vậy, nếu để tìm ra điểm có thể cho User 1, tôi đã suy nghĩ rằng chỉ cần lấy chênh lệch tuyệt đối trong những cuốn sách sử dụng 1 đọc với những người dùng khác. Sau đó, tôi sẽ sử dụng sự khác biệt đó để tìm ra người dùng nào từ danh sách đó là "gần nhất" với người dùng 1. Nhưng trong tình huống thực tế, sẽ có nhiều hơn?/Điểm số không xác định. Vì vậy, làm thế nào để đối phó với những điểm chưa biết khi sử dụng knn?

Tôi không có bất kỳ mã nào vì tôi chưa thực sự hiểu cách triển khai.

Mọi trợ giúp đều được đánh giá cao!

Trả lời

8

Bạn không có "tính năng không xác định" bạn có điểm dữ liệu không đầy đủ.

Đây thực sự là vấn đề nổi tiếng trong kNN và có một mẫu được xác thực hoàn toàn để xử lý.

Mặc dù vấn đề thực sự là một "dữ liệu không đầy đủ" vấn đề, trong bối cảnh KNN nó thường (thường?) gọi là thưa thớt vấn đề.

Trong thực tế, vấn đề thưa thớt trong việc xây dựng mô hình knn là, ngoại trừ có thể lưu trữ/truy xuất hiệu quả dữ liệu bao gồm mô hình, mấu chốt của kNN.

Ví dụ, hãy xem xét động cơ khuyến nghị của Amazon.com, trong đó xếp hạng sản phẩm như sử dụng các tính năng bao gồm các cột và người sử dụng bao gồm các hàng, cho ma trận này được hoàn thành 100%, mỗi Amazon khách hàng sẽ có đã mua và xem xét tất cả các porduct Amazon bán. Độ thưa thớt thực tế của ma trận này phải> 95%.

Kỹ thuật phổ biến nhất (và đó vẫn là nhà nước-of-the-art như xa như tôi biết) được biết đến như NNMA, hoặc không âm ma trận xấp xỉ. Kỹ thuật này cũng thường được gọi là không chính xác là NNMF, trong đó F là viết tắt của hệ số hóa. (NNMA dựa trên kỹ thuật hệ số hóa, nhưng kết quả không phải là yếu tố của ma trận dữ liệu gốc). Tôi đề cập đến điều này vì thuật ngữ thay thế này, mặc dù không chính xác được sử dụng rộng rãi nên tôi sẽ đưa nó vào các truy vấn công cụ tìm kiếm của tôi. Về bản chất, techique này có thể được sử dụng để loại bỏ thưa thớt từ một ma trận, hoặc đặt một cách khác, để điền các ô bị thiếu (tức là, khách hàng tại hàng R chưa reviwed sản phẩm của cột C).

Bạn có thể tìm thấy triển khai hoàn chỉnh nnma, bao gồm hướng dẫn đi kèm (trong python + numpy) trong Albert Au Yeung Ching-man's blog.

Ngoài ra, có một số gói python (có sẵn thông qua PyPI) có chứa mã được đóng gói cho NNMA. Tôi chỉ sử dụng một trong số này, PyMF, mà bạn có thể tìm thấy tại Google Code.

Vì vậy mà bạn có thể xem như thế nào NNMA công trình kỳ diệu của nó, đây là thực hiện đơn giản nhưng hoàn chỉnh của tôi của NNMA trong python + NumPy:

import numpy as NP 

def cf(q, v): 
    """ the cost function """ 
    qv = (q - v)**2 
    return NP.sum(NP.sum(qv, axis=0)) 


def nnma(d, max_iter=100): 
    x, y = d.shape 
    z = y 
    w = NP.random.rand(x, y) 
    h = NP.random.rand(y, z) 
    for i in range(max_iter): 
     wh = NP.dot(w, h) 
     cost = cf(d, wh) 
     if cost == 0: 
      break 
     hn = NP.dot(w.T, d) 
     hd = NP.dot(NP.dot(w.T, w), h) 
     h *= hn/hd 
     wn = NP.dot(d, h.T) 
     wd = NP.dot(NP.dot(w, h), h.T) 
     w *= wn/wd 
    return NP.dot(w, h) 

Để sử dụng NNMA chức năng này, chỉ cần vượt qua trong mảng 2D (ma trận) với "0" cho mỗi ô bị thiếu (nói cách khác, ma trận dữ liệu của bạn, được chèn "0" cho mỗi giá trị bị thiếu):

>>> d # the original (sparse) data matrix with missing cells denoted by "0"s 

    array([[ 7., 0., 4., 7., 0., 1.], 
     [ 3., 9., 7., 3., 1., 7.], 
     [ 4., 4., 3., 7., 3., 9.], 
     [ 4., 8., 0., 9., 2., 1.], 
     [ 6., 3., 9., 5., 9., 3.], 
     [ 6., 1., 4., 4., 1., 0.], 
     [ 0., 4., 8., 6., 0., 5.], 
     [ 9., 0., 6., 0., 5., 2.], 
     [ 6., 8., 4., 6., 3., 7.], 
     [ 3., 6., 3., 8., 7., 2.]]) 

>>> d1 = nnma(d)  # call nnma, passing in the original data matrix 

>>> d1 # the approximated data matrix with all missing values populated 

    array([[ 6.998, 0.29 , 3.987, 7.008, 0.292, 0.796], 
      [ 2.989, 8.92 , 6.994, 3.02 , 1.277, 7.053], 
      [ 4.007, 4.496, 2.999, 7.01 , 3.107, 8.695], 
      [ 4.005, 8.019, 0.254, 9.002, 1.917, 0.89 ], 
      [ 5.998, 3.014, 9.001, 4.991, 8.983, 3.052], 
      [ 5.992, 1.077, 4.007, 3.976, 0.753, 0.464], 
      [ 0.346, 3.436, 7.993, 5.988, 0.194, 5.355], 
      [ 9.001, 0.124, 5.997, 0.375, 5.02 , 1.867], 
      [ 6. , 7.994, 3.998, 6. , 2.999, 7.009], 
      [ 2.995, 6.022, 3.001, 7.987, 6.939, 2.185]]) 

Vì vậy, như bạn có thể thấy, kết quả không quá xấu, đặc biệt là cho một thực hiện rất đơn giản. Tất cả các mục bị thiếu đều được điền và phần còn lại của giá trị khá gần với giá trị tương ứng từ ma trận dữ liệu gốc, ví dụ: cột 0, hàng 0 là 7,0 trong ma trận dữ liệu gốc và 6,998 trong ma trận gần đúng.

2

KNN thường nhạy cảm với #features. Trong cuộc sống thực, tôi hy vọng bạn sẽ có nhiều sách hơn.

Tôi sẽ cố gắng thay đổi không gian tính năng: thay vì có một tính năng cho mỗi tài liệu, có thể đáng để điều tra bằng cách sử dụng danh sách sách làm đối tượng địa lý.

Feature1 = { books with score 1 } 
Feature2 = { books with score 2 } 
... 

Bây giờ, bạn có thể xác định khoảng cách cho từng tính năng - có thể bằng cách sử dụng recall and precision giữa mỗi hai danh sách 2 người dùng.

Một ưu điểm khác của phương pháp này là bạn có thể dễ dàng đưa trọng số cho các tính năng - có thể danh sách sách được xếp hạng là 5 là thông tin nhiều hơn sau đó xếp hạng với 3?

Những bất lợi rõ ràng, bạn sẽ không đạt được bất kỳ tăng nếu người dùng A, B đứng một cuốn sách với 4,5 - tuy nhiên nó cũng có thể được giải quyết bằng cách thêm tính năng khác, so sánh các danh sách này giữa hai người dùng ..

Tuyên bố từ chối: Tôi chưa bao giờ thử nghiệm phương pháp này và tôi không biết nó sẽ hoạt động như thế nào - nhưng tôi nghĩ đó là một cách tiếp cận đáng để nghiên cứu. Tôi nghĩ rằng không có cách nào tốt để xác định xem gợi ý này có mang lại kết quả tốt hay không, ngoại trừ thử nghiệm thực nghiệm, có thể được thực hiện bằng cách sử dụng cross-validation từ tập huấn luyện của bạn.

3

Mảnh bạn đang thiếu là phương pháp đo khoảng cách. Tương quan Pearson là một trong những phương pháp được sử dụng rộng rãi nhất. Khoảng cách Cosine là một khoảng cách khác. Khoảng cách L1 (tổng của sự khác biệt tuyệt đối) thường không cho kết quả tốt.

Nếu bạn google, bạn sẽ tìm thấy cách được đề xuất để xử lý các giá trị bị thiếu dựa trên khoảng cách tương tự như bạn sử dụng là gì. Ví dụ, trong Pearson chỉ những cuốn sách được đánh giá thường bởi hai người dùng được sử dụng để đo lường mối tương quan, do đó các giá trị bị thiếu chỉ đơn giản là bị bỏ qua. Điều này có ý nghĩa, như thể một tỷ lệ nhỏ các cuốn sách được đọc bởi hai người dùng là phổ biến mà rất có thể ngụ ý rằng có sở thích khác nhau. Trong khoảng cách Cosine, các giá trị còn thiếu có thể được giả định bằng không.

Cách tiếp cận thường được sử dụng khác là để ám chỉ các giá trị bị thiếu. Ví dụ, bạn có thể sử dụng Pearson đầu tiên để tìm sự giống nhau giữa các cuốn sách và sau đó cho mỗi người dự đoán các xếp hạng còn thiếu.

0

Đề xuất của tôi là bạn sử dụng Phân tích giá trị số ít (SVD) để thực hiện Giảm xếp hạng trên tập dữ liệu của bạn. Điều này sẽ lấp đầy những giá trị bị thiếu bằng cách giảm hiệu quả số lượng các tính năng mà mỗi cuốn sách phải cung cấp. Điều này rất giống với Phân tích ngữ nghĩa tiềm ẩn, tra cứu nó.

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