Cách thực hiện SVD để áp đặt các giá trị bị thiếu, một ví dụ cụ thể


8

Tôi đã đọc những bình luận tuyệt vời về cách xử lý các giá trị bị thiếu trước khi áp dụng SVD, nhưng tôi muốn biết nó hoạt động như thế nào với một ví dụ đơn giản:

        Movie1 Movie2 Movie3
User1     5             4
User2     2      5      5
User3            3      4
User4     1             5
User5     5      1      5

Với ma trận trên, nếu tôi loại bỏ các giá trị NA, cuối cùng tôi sẽ chỉ còn User2 và User5. Điều này có nghĩa là U của tôi sẽ là 2 × k. Nhưng nếu tôi dự đoán các giá trị mất tích, U sẽ là 5 × k, mà tôi có thể nhân với các giá trị số ít và V .

Có ai trong số các bạn điền vào các giá trị còn thiếu trong ma trận ở trên bằng cách trước tiên xóa người dùng có giá trị bị thiếu và sau đó áp dụng SVD không? Vui lòng cung cấp một lời giải thích rất đơn giản về quy trình bạn đã áp dụng và làm cho câu trả lời của bạn trở nên thực tế (tức là số nhân với một số khác đưa ra câu trả lời) thay vì sử dụng quá nhiều ký hiệu toán học.

Tôi đã đọc các liên kết sau:

stats.stackexchange.com/q/33142

thống kê.stackexchange.com / q / 31096

stats.stackexchange.com/q/33103


Mọi người đều không xem ít nhất một bộ phim, phải không? Vì vậy, loại bỏ tất cả người dùng thiếu dữ liệu sẽ dẫn đến không có người dùng và không có hàng nào trong ma trận tiện ích (xếp hạng) của bạn. Vì vậy, bạn không thể xóa bất kỳ hàng nào đang thiếu một số dữ liệu, phải không? SVD không hữu ích cho các bộ dữ liệu có giá trị thiếu. Có các kỹ thuật nhân tố ma trận khác tuy nhiên có thể áp đặt chúng. Hãy nhìn xem, SVD sẽ cần bạn xử lý dữ liệu bị thiếu trước, một số cách khác. Bạn có thể buộc tội theo cách ngớ ngẩn bằng cách chỉ sử dụng bất kỳ hằng số cũ nào nhưng sau đó, điểm của việc sử dụng dữ liệu rác như vậy là gì? Bạn có muốn rác được xuất ra không?
Geoffrey Anderson

Câu trả lời:


5

SVD chỉ được xác định cho ma trận hoàn chỉnh. Vì vậy, nếu bạn dính vào SVD đơn giản, bạn cần điền vào các giá trị bị thiếu này trước đó (SVD không phải là thuật toán ẩn cho mỗi se). Các lỗi bạn giới thiệu hy vọng sẽ được loại bỏ bằng cách tiếp cận nhân tố ma trận của bạn (giả định chung: dữ liệu được tạo bởi mô hình xếp hạng thấp).

Loại bỏ các hàng hoàn chỉnh như bạn muốn làm chỉ là xấu. Ngay cả việc đặt các giá trị còn thiếu về 0 sẽ tốt hơn.

Có nhiều chiến lược cắt giảm, nhưng trong trường hợp này, tôi sẽ áp đặt với nghĩa trung bình của cột (hoặc có thể là hàng có nghĩa là hàng). Đây về cơ bản là chiến lược được đề xuất trong liên kết thứ 2 của bạn.

        Movie1 Movie2 Movie3
User1   5             4
User2   2      5      5
User3          3      4
User4   1             5
User5   5      1      5

trở thành (trung bình cột; điểm trung bình của phim)

        Movie1 Movie2 Movie3
User1   5      3      4
User2   2      5      5
User3   3      3      4
User4   1      3      5
User5   5      1      5

Và một nhận xét nữa: bạn nên xử lý trước dữ liệu. Ít nhất trừ đi giá trị trung bình từ tất cả các giá trị!

Có một cái nhìn vào giới thiệu này . Nó điều chỉnh phương pháp tiếp cận + SVD và cũng nói về một mô hình trực tiếp hơn về các giá trị bị thiếu. Nhưng trong trường hợp này, các thuật toán khác được sử dụng.


Cảm ơn bạn đã trả lời của bạn. Xin vui lòng nhìn vào liên kết blog này . Có vẻ như Simon chỉ sử dụng xếp hạng không thiếu, tức là anh bỏ qua các xếp hạng bị thiếu. Đây có phải là giống như tôi đang đề xuất. Xin tư vấn.
Boro Dega

2
Hãy dành thời gian của bạn và đọc liên kết của tôi. Nó bao gồm chính xác chiến lược mà bloglink của bạn mô tả. Anh ta không tranh luận bất cứ điều gì và anh ta không sử dụng SVD . Anh ta chỉ sử dụng một số công thức giảm độ dốc Stochastic của phương pháp tiếp cận có động cơ SVD (cung cấp khả năng bỏ qua tất cả các mục bị thiếu)! Để biết thêm thông tin, chỉ cần google cho yếu tố ma trận + độ dốc ngẫu nhiên . Có rất nhiều công việc!
sascha

2

Có rất nhiều cách để dự đoán các giá trị bị thiếu nhưng SVD cổ điển không phải là một trong số đó. Điều tuyệt vời là máy học hiện cung cấp nhiều cách để thực hiện điều này, một số trong số đó dựa trên yếu tố ma trận, một số khác hoàn toàn so với nhân tố ma trận. Bạn có thể chọn và tạo một mô hình hoàn toàn tùy chỉnh và điều này thường được thực hiện ngay bây giờ vì các công cụ này đủ mạnh ngày nay. Yếu tố ma trận vẫn chắc chắn là một cách tốt để dự đoán các giá trị còn thiếu trong dữ liệu thưa thớt, nhưng bản thân SVD thì không.

Câu trả lời được chấp nhận ở đây, rõ ràng đã khuyên người hỏi chỉ nên chọn bất kỳ giá trị không đổi nào như 0 hoặc 99 hoặc -3 hoặc bất cứ điều gì, để gán trước cho các giá trị còn thiếu, sau đó chạy SVD trên đó. Đây là một câu trả lời tồi nếu mục tiêu là dự đoán trên các bộ dữ liệu thưa thớt. Nhưng nếu thay vào đó, mục tiêu của OP chỉ đơn giản là chạy SVD, thì việc gán trước bất kỳ giá trị không đổi nào sẽ hoạt động tốt, vì vậy hãy chọn bất kỳ giá trị nào và sau đó chạy SVD nếu kết quả không quan trọng đối với OP. Tôi đã nói rằng SVD là một giải pháp tồi để dự đoán các giá trị bị thiếu bởi vì giả sử giá trị không đổi trong tất cả các vị trí thưa thớt có thể là do bạn giới thiệu nhiều điểm nhiễu hơn nghĩa đen so với các điểm dữ liệu tốt đã biết.

Điểm học tiếng ồn là gì? Và tại sao bạn thậm chí sẽ đề xuất rằng các giá trị còn thiếu thực sự là cùng một giá trị không đổi, khi quan điểm của bài tập là dự đoán chúng là gì? Bạn không mong đợi các giá trị còn thiếu thực sự giống nhau, phải không? Điều đó sẽ đánh giá thấp số lượng các thành phần chính dẫn đến kết quả là nếu có dữ liệu không đổi quá phổ biến trong tập dữ liệu của bạn, vì một điều. Ngoài ra đó là một vấn đề dự đoán rất dễ dàng sau đó. Bạn không cần một thuật toán học tập hay thậm chí là một thuật toán nhân tố. Bạn chỉ nói các giá trị còn thiếu là một hằng số đã biết. Không cần phải chê! Bạn đã làm điều đó rồi, bằng tay, chỉ bằng cách đoán theo cách cũ.

Bạn có thể nhận được fancier với SVD và xác định trước các giá trị bị thiếu bằng cách sử dụng phân phối ngẫu nhiên có nguồn gốc thực nghiệm bằng cách sử dụng độ lệch trung bình và độ lệch chuẩn từ dữ liệu đã biết (không thiếu). Nhưng sau đó, có sự ngẫu nhiên thay vì các mẫu trong dữ liệu và bạn có thể mong đợi yếu tố ma trận và giảm kích thước vốn có trong kỹ thuật đó để tìm ra các mẫu mà bạn mong đợi ở đó. Tuy nhiên, bạn sẽ không phát hiện ra nhiều kiểu sử dụng trong tiếng ồn ngẫu nhiên, vì vậy nó cũng không giúp sử dụng theo cách này.

Điểm mấu chốt là đầu ra của SVD - hoặc bất kỳ thuật toán nào khác - sẽ phần lớn là rác bất cứ khi nào có quá nhiều dữ liệu rác do điều tra viên cung cấp. Không có thuật toán nào có thể học được mô hình tốt từ dữ liệu rác đa số. Chỉ cần nói không với toàn bộ "cách tiếp cận" đó.

Dường như mục tiêu của OP là dự đoán và sử dụng thiết kế nhân tố ma trận như một phần của thuật toán học tập. Trong trường hợp này, điều tuyệt vời là bạn có thể viết hàm chi phí của mình một cách khả thi mà bỏ qua chi phí, bất kỳ dự đoán nào được thực hiện đối với các giá trị còn thiếu. Không có dữ liệu rác nào được đưa vào thuật toán học theo cách này.Sử dụng một trình tối ưu hóa dựa trên độ dốc tốt, chẳng hạn như Adam (có những cái khác). Bạn có thể nhận được một giải pháp có thể đo lường chính xác ở bất kỳ mức độ nào về đào tạo, nhà phát triển và tập dữ liệu thử nghiệm, miễn là bạn tuân theo một phương pháp dự án máy học tốt. Vui lòng thêm các thuật ngữ và độ phức tạp vào mô hình của bạn như xu hướng người dùng, xu hướng mục, độ lệch toàn cục, chính quy hoặc bất cứ điều gì khác mà bạn cần để kiểm soát lỗi sai lệch và sai lệch phương sai cho các yêu cầu của dự án và bộ dữ liệu có sẵn.

Một gói phát triển máy học hiện đại làm cho điều này trở thành một cách tiếp cận thực tế ngay bây giờ. Ví dụ, TensorFlow (hoặc Microsoft CNTK et al) có thể giúp bạn thực hiện chính xác những gì tôi đã mô tả trên bộ dữ liệu thưa thớt bằng mô hình nhân tố ma trận.


Phản xạ tuyệt vời. Tôi thực sự thích câu trả lời của bạn và nó là tại chỗ. Bạn có thể mở rộng câu trả lời của bạn với một kịch bản cho thấy các giải pháp của bạn. Sau đó sẽ là câu trả lời cho câu hỏi. Cảm ơn
Boro Dega

2

Bài viết này bao gồm những gì bạn đang tìm kiếm trong chi tiết rất thanh lịch (sử dụng ngưỡng mềm SVD). Giống như Geoffrey đã chỉ ra, họ làm điều này bằng cách viết hàm chi phí của riêng họ, loại trừ chi phí, mọi dự đoán được đưa ra so với các giá trị còn thiếu.

Tóm tắt: Mazumdar et al sử dụng các kỹ thuật thư giãn lồi để cung cấp một chuỗi các giải pháp xếp hạng thấp thường xuyên cho các vấn đề hoàn thành ma trận quy mô lớn. Thuật toán PHẦN MỀM TÁC DỤNG lặp đi lặp lại thay thế các phần tử bị thiếu bằng các phần tử thu được từ một SVD ngưỡng mềm. Khai thác cấu trúc vấn đề, họ chỉ ra rằng nhiệm vụ có thể được thực hiện với độ phức tạp của tuyến tính theo thứ tự trong các kích thước ma trận. Thuật toán có thể dễ dàng mở rộng đến các ma trận lớn; ví dụ: nó phù hợp với xấp xỉ thứ hạng 95 với toàn bộ khóa đào tạo Netflix được đặt trong 3,3 giờ. Các phương pháp đạt được các lỗi đào tạo và kiểm tra tốt và có thời gian vượt trội khi so sánh với các kỹ thuật hiện đại cạnh tranh khác.

@article {mazumder2010spectral, title = {Thuật toán chính quy hóa phổ để học các ma trận không hoàn chỉnh lớn}, tác giả = {Mazumder, Rahul và Hastie, Trevor và Tibshirani, Robert}, tạp chí = {Tạp chí nghiên cứu máy học}, volume = {11}, số = {tháng 8}, trang = {2287--2322}, năm = {2010}}

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.