คำถาม
ฉันจะทำนายอันดับสำหรับผู้ใช้ใหม่ในรุ่น 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 ดั้งเดิมได้ แต่ฉันคิดว่านั่นจะทำให้ฉันต้องสั่งสอนแบบจำลองใหม่ แน่นอนว่าต้องมีวิธีที่สวยงามกว่านี้อีกไหม?
ตอนนี้ฉันอยู่ไหน:
ฉันคิดว่าฉันต้องหาตัวแทนแฝงของเวกเตอร์ใหม่ ตามกระดาษต้นฉบับเราสามารถคำนวณได้ดังนี้:
แต่เมื่อฉันคำนวณโดยใช้ค่าในกระดาษมันไม่ตรงกับค่าจากแบบจำลอง ฉันจะแก้ไขอัลฟาและพารามิเตอร์กู แต่ผมคิดว่า 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
แต่สิ่งนี้ไม่ตรงกัน