Spring Boot是一个基于Java的开源框架,它简化了Spring应用程序的开发过程。Spring Boot提供了一种快速构建、运行和部署微服务的方法,使得开发人员能够更专注于业务逻辑的实现,而无需关心底层的基础设施和配置。Spring Boot的主要特点包括:
(1)约定优于配置(Convention Over Configuration):Spring Boot遵循约定优于配置的原则,提供了一系列的默认配置和自动配置功能,使得开发者可以按照约定的方式编写代码,而无需显式地配置各种组件和依赖关系。这使得开发人员可以更加专注于业务逻辑的实现,而无需关心底层的基础设施和配置。
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
class SVDRecommender:
def __init__(self, n_factors=20, n_epochs=30, lr=0.005, reg=0.02):
self.n_factors = n_factors
self.n_epochs = n_epochs
self.lr = lr
self.reg = reg
def fit(self, ratings):
self.user_ids = ratings['user_id'].unique()
self.item_ids = ratings['item_id'].unique()
self.user_id_map = {uid: i for i, uid in enumerate(self.user_ids)}
self.item_id_map = {iid: i for i, iid in enumerate(self.item_ids)}
self.id_user_map = {i: uid for uid, i in self.user_id_map.items()}
self.id_item_map = {i: iid for iid, i in self.item_id_map.items()}
self.n_users = len(self.user_ids)
self.n_items = len(self.item_ids)
self.P = np.random.normal(scale=0.1, size=(self.n_users, self.n_factors))
self.Q = np.random.normal(scale=0.1, size=(self.n_items, self.n_factors))
for epoch in range(self.n_epochs):
for _, row in ratings.iterrows():
u = self.user_id_map[row['user_id']]
i = self.item_id_map[row['item_id']]
r_ui = row['rating']
pred = self.predict_single(u, i)
err = r_ui - pred
self.P[u] += self.lr * (err * self.Q[i] - self.reg * self.P[u])
self.Q[i] += self.lr * (err * self.P[u] - self.reg * self.Q[i])
print(f"Epoch {epoch+1}/{self.n_epochs} completed.")
def predict_single(self, u, i):
return np.dot(self.P[u], self.Q[i])
def predict(self, user_id, item_id):
if user_id not in self.user_id_map or item_id not in self.item_id_map:
return np.nan
u = self.user_id_map[user_id]
i = self.item_id_map[item_id]
return self.predict_single(u, i)
def recommend(self, user_id, N=5):
if user_id not in self.user_id_map:
return []
u = self.user_id_map[user_id]
scores = np.dot(self.Q, self.P[u])
top_indices = np.argsort(scores)[::-1][:N]
return [(self.id_item_map[i], scores[i]) for i in top_indices]