Spark ALS: แนะนำสำหรับผู้ใช้ใหม่


10

คำถาม

ฉันจะทำนายอันดับสำหรับผู้ใช้ใหม่ในรุ่น ALS ที่ผ่านการฝึกอบรมใน Spark ได้อย่างไร (ใหม่ = ไม่เห็นในช่วงเวลาการฝึกอบรม)

ปัญหา

ฉันกำลังติดตามกวดวิชา Spark ALS อย่างเป็นทางการที่นี่:

http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.html

ฉันสามารถสร้างผู้แนะนำที่ดีด้วย MSE ที่เหมาะสม แต่ฉันกำลังดิ้นรนกับวิธีการป้อนข้อมูลใหม่ให้กับโมเดล บทช่วยสอนจะเปลี่ยนการให้คะแนนของผู้ใช้คนแรกก่อนการฝึกอบรม แต่นี่เป็นการแฮ็คจริงๆ พวกเขาให้คำแนะนำต่อไปนี้:

9.2 ปัจจัยเมทริกซ์การขยาย:

ในบทช่วยสอนนี้เราเพิ่มคะแนนของคุณในชุดการฝึกอบรม วิธีที่ดีกว่าในการรับคำแนะนำสำหรับคุณคือการฝึกอบรมแบบจำลองการแยกตัวประกอบเมทริกซ์ก่อนจากนั้นจึงขยายแบบจำลองโดยใช้การจัดอันดับของคุณ หากสิ่งนี้ฟังดูน่าสนใจสำหรับคุณคุณสามารถดูการใช้งาน MatrixFactorizationModel และดูวิธีการอัพเดตโมเดลสำหรับผู้ใช้ใหม่และภาพยนตร์ใหม่

การใช้งานไม่ได้ช่วยฉันเลย เป็นการดีที่ฉันกำลังมองหาสิ่งที่ชอบ:

predictions = model.predictAllNew(newinput)

แต่ไม่มีวิธีการดังกล่าวอยู่ ฉันสามารถไปและดัดแปลง RDD ดั้งเดิมได้ แต่ฉันคิดว่านั่นจะทำให้ฉันต้องสั่งสอนแบบจำลองใหม่ แน่นอนว่าต้องมีวิธีที่สวยงามกว่านี้อีกไหม?

ตอนนี้ฉันอยู่ไหน:

ฉันคิดว่าฉันต้องหาตัวแทนแฝงของเวกเตอร์ใหม่ ตามกระดาษต้นฉบับเราสามารถคำนวณได้ดังนี้:

Xยู=(YTยูY+λผม)-1YTยูพี(ยู)

แต่เมื่อฉันคำนวณโดยใช้ค่าในกระดาษมันไม่ตรงกับค่าจากแบบจำลอง ฉันจะแก้ไขอัลฟาและพารามิเตอร์กู แต่ผมคิดว่า implentation MLLIB มีที่แตกต่างกันการดำเนินงาน มันถูกกำหนดไว้ที่นี่ (ดูบรรทัดที่ 1304) แต่ไม่เก่งที่ Scala นี่ยากมากที่จะทำวิศวกรรมย้อนกลับให้ฉัน ...ยู

ความพยายามในปัจจุบันของฉัน:

V = model.productFeatures().map(lambda x: (x[1])).collect() #product latent matrix Y

Cui =  alpha * np.abs(newinput)
Cui =  (1. + Cui) / (Cui)
Cui[np.where(newinput == 0)] = 0
Cui = np.diag(Cui)

lambdaI = len(np.where(newinput!=0)) * regularization_parameter * np.eye(np.shape(V)[1]) #
term   = np.dot(np.dot(Vt,Cui),V)+lambdaI
term   = np.dot(np.linalg.inv(term),Vt)
term   = np.dot(term,Cui)
term   = np.dot(term,newinput)
latentinput = term

แต่สิ่งนี้ไม่ตรงกัน

คำตอบ:


9

มีคำถามมากมายที่นี่ ขั้นแรกสำหรับผู้ใช้ใหม่ที่ไม่มีข้อมูลไม่มีวิธีใช้โมเดลผู้แนะนำ หากคุณไม่มีข้อมูลเกี่ยวกับผู้ใช้สิ่งเดียวที่คุณทำได้คือให้คำแนะนำเริ่มต้น

แน่นอนเมื่อคุณมีข้อมูลใด ๆและคุณสามารถสร้างแบบจำลองใหม่เพื่อรวมผู้ใช้คุณสามารถให้คำแนะนำได้ คุณสามารถทำได้ใน Spark แต่คุณรู้อยู่แล้ว การดำเนินการนี้จะใช้เวลานานเกินไปหากคุณต้องการเพิ่มข้อมูลเกี่ยวกับผู้ใช้ใหม่ขณะใช้งานจริง เทคนิคที่คุณต้องการเรียกว่า "fold-in" ซึ่งใช้เพื่อหาว่าเวกเตอร์ผู้ใช้ใหม่คืออะไร (ประมาณ) ที่ได้รับจากรายการที่ผู้ใช้โต้ตอบ มันเป็นแค่พีชคณิตเชิงเส้นและทำตามสมการที่คุณให้

ฉันขุดสไลด์เก่าออกมาซึ่งอาจช่วย:

ALS Fold-In

"ลูกบาศ์ก" ไม่แตกต่างกันจริงๆ ฉันได้เพิ่ม 'ส่วนขยาย' เพื่อจัดการกับกรณีของอินพุตเชิงลบ แต่มันก็เหมือนกันสำหรับอินพุตที่เป็นบวก

ต่อไปนี้เป็นการนำ fold-in มาใช้แม้ว่าฉันคิดว่ามันจะมีความหนาแน่นเกินกว่าจะมีมูลค่ามาก:

https://github.com/OryxProject/oryx/blob/2c01d496f93f2825a076eb7fe492aa39a5290aa6/app/oryx-app-common/src/main/java/com/cloudera/oryx/app/als/ALSUtils.java#L74

การคำนวณเวกเตอร์ผู้ใช้ใหม่ที่มีนัยโดยการโต้ตอบระหว่างผู้ใช้กับรายการนั้นเป็นพีชคณิตเชิงเส้นค่อนข้างง่าย ส่วนที่ยุ่งยากที่ฉันพบก็คือการตัดสินใจว่าจะให้น้ำหนักมากแค่ไหน

หวังว่าเป็นการผลักไปในทิศทางที่ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.