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.