Módulo 6 · Engenharia de Software · ES06 · Aula 1 de 10
Filtragem Colaborativa
baseada em Item
Como Amazon, Netflix e Spotify recomendam sem precisar te conhecer
🎯 Recomendação
📐 Similaridade
🧮 Álgebra linear
⚡ Pré-computação
🛒 Amazon 2003
DAILY · 15 MIN
15:00
✅ O que fiz desde a última aula?
🎯 O que vou fazer hoje?
🚧 Algum bloqueio?
🤝 Preciso de ajuda?
Agenda da Aula
Do problema de descoberta à recomendação escalável

1️⃣ Motivação

Problema da descoberta. Tipos de sistemas de recomendação.

2️⃣ Intuição

User-based vs Item-based. A matriz usuário × item pela coluna.

3️⃣ Matemática

Similaridade, adjusted cosine, predição ponderada.

4️⃣ Prática

Amazon 2003. Avaliação. RM-ODP. Artefato. Mão na massa.

🎯 Objetivo da aula: ao final, você deve saber por que Item-based venceu na Amazon, como calcular similaridade entre itens e como transformar isso em recomendação para o projeto do módulo.

O Problema da Descoberta
Quando a oferta é infinita, encontrar é mais difícil do que produzir
300M+
Produtos na Amazon
Nenhum humano navega isso sem filtro.
17k+
Títulos na Netflix
Mais escolha = mais paralisia.
100M+
Faixas no Spotify
60k novas por dia.
35%
Vendas da Amazon vêm de recomendação
(McKinsey, 2013)

💡 A tese central

Sistemas de recomendação não são um "extra bacana". São o mecanismo principal de distribuição em plataformas de catálogo infinito. A engenharia por trás deles é crítica como a de banco de dados ou autenticação.

As 4 Famílias de Recomendador
Visão em tabela · frase, onde brilha e ponto cego de cada uma
Família
Frase
Onde brilha
Ponto cego
📊Popularidade
"o que todo mundo vê"
cold start
sem personalização, vira bolha
🏷️Conteúdo
"parecido por atributos (gênero, tag)"
explicável
precisa metadados curados
👥Colaborativa
"gente como você também gostou"
escala com uso
cold start de user/item
FOCO DA AULA
🔀Híbrido
"combinação das 3"
produção real
complexo

🎯 Por que a colaborativa? Ela escala com uso da plataforma, não com curadoria humana. Amazon, Netflix, YouTube e Spotify usam variações dela como motor principal. É onde a nossa aula vai focar.

Tipos de Sistemas de Recomendação
Quatro famílias — cada uma com suas forças e pontos cegos

📊 Popularidade

"O que todo mundo está vendo"

  • Simples, sem personalização
  • Bom para cold start
  • Efeito bolha: todos veem o mesmo

🧾 Conteúdo

"Similar ao que você curtiu"

  • Usa atributos (gênero, tag)
  • Sem dados de outros usuários
  • Preso ao que você já conhece

👥 Colaborativa

"Gente como você também gostou"

  • User-based ou Item-based
  • Usa comportamento coletivo
  • Foco desta aula

🧬 Híbrido

"Combinação inteligente"

  • Mistura duas ou mais abordagens
  • Resolve pontos cegos
  • Mais complexo de manter

🎯 Por que colaborativa? Não exige descrever o conteúdo manualmente. Escala com quantidade de dados de uso, não com curadoria humana. Essa é a razão econômica pela qual Amazon e Netflix apostam pesado nela.

User-based vs Item-based · A Pergunta Muda Tudo
Mesma matriz de dados, duas perguntas, dois sistemas
User-based
"Quem é parecido comigo?"

Procura usuários com gosto similar ao seu. Recomenda o que eles gostaram e você ainda não viu.

  • Olhar as linhas da matriz
  • Similaridade entre usuários
  • Requer recomputação frequente
  • Funciona bem em comunidades pequenas
Item-based · HOJE
"O que é parecido com o que comprei?"

Procura itens com padrão de consumo similar. Recomenda os mais próximos aos que você já consumiu.

  • Olhar as colunas da matriz
  • Similaridade entre itens
  • Pré-computável offline
  • Escala em catálogos gigantes

🔑 O giro de perspectiva — trocamos a pergunta "quem se parece comigo?" por "o que se parece com o que eu gosto?". Isso parece trivial, mas é uma decisão arquitetural que muda custo computacional, estabilidade, explicabilidade e cold start. Essa foi a inovação da Amazon em 2001-2003.

A Matriz Usuário × Item
Estrutura de dados central · ratings de 1 a 5 · muitos vazios
R (4 usuários × 5 itens) — ratings de 1 a 5
🎬 Matrix
🎞️ Inception
🎭 Titanic
🚀 Interstellar
🎠 Amelie
Ana
5
4
·
5
·
Bia
·
3
5
·
4
Caio
4
5
2
5
·
Davi
5
·
1
·
3

📐 Duas leituras da mesma matriz

  • Linha (usuário) → vetor de ratings em ℝm
  • Coluna (item) → vetor de ratings em ℝn

🎯 Item-based olha por coluna

Cada item i vira um vetor de dimensão n (nº de usuários). A similaridade entre dois itens é a similaridade entre seus vetores-coluna.

⚠️ Esparsidade

Matrizes reais têm >99% de células vazias. Netflix: ~1 bilhão de ratings em uma matriz de ~500M×17k. Tudo que você vai calcular precisa lidar com isso.

Similaridade entre Itens · 3 Métricas
Três formas de transformar dois vetores-coluna em um número [-1, 1]

📐 Cosseno

sim(i,j) = i·j / (||i|| · ||j||)

Prós: simples, rápido.
Contras: ignora que cada usuário tem sua própria escala (quem dá só 3-5 vs quem dá 1-5).

🎯 Adjusted Cosine

// subtrai média do USUÁRIO
Σ(Rui − R̄u)(Ruj − R̄u)
───── / ─────
Σ(Rui−R̄u)² · √Σ(Ruj−R̄u

Sarwar et al. 2001. Corrige viés de escala. Padrão em item-based.

🔢 Jaccard (binário)

sim(i,j) = |Ui ∩ Uj| / |Ui ∪ Uj|

Quando não há rating numérico (só compra/não-compra, clique/não-clique). Mede sobreposição de audiências.

🧪 Na prática: comece com adjusted cosine se seus dados têm ratings numéricos. Use Jaccard se só tem interações binárias. Cosseno puro só se os usuários tiverem escalas comparáveis.

Similaridade é Geometria 📐
Cada item é um vetor · o cosseno do ângulo entre vetores = similaridade
Caio Ana → 0 1 2 3 4 5 5 4 3 2 1 🎬 Matrix (5, 4) 🎞️ Inception (4, 5) 🎭 Titanic (1, 2) 🎠 Amelie (2, 1) θ ≈ 8° cos(8°) ≈ 0.99 → muito similares cos(55°) ≈ 0.57 → diferentes
Plano 2D simplificado (Ana × Caio). Na prática, n usuários = n dimensões.

🧭 A intuição

Matrix (5,4) e Inception (4,5) "apontam" na mesma direção — ângulo pequeno (~8°) → cos(θ) ≈ 0.99.

📏 Cosseno mede direção, não tamanho

Mesmo que Matrix seja um vetor "mais longo" que Titanic, o que importa é o ângulo. Dois vetores curtinhos podem ser "mais parecidos" que um curto e um longo na mesma direção? Não — porque o cosseno ignora o comprimento.

🎯 Clusters emergem naturalmente

Matrix + Inception formam um cluster "sci-fi/ação". Titanic + Amelie formam outro cluster "romance". O algoritmo descobre esses grupos sem conhecer os gêneros.

Por que "Adjusted"? · O Viés Individual 🎚️
Caio dá notas em geral mais altas que Davi — a média do usuário distorce o cosseno puro
ANTES · ratings brutos
Davi Caio → 🎬 Matrix 🎭 Titanic todos os vetores no mesmo quadrante ⚠️
DEPOIS · subtraiu a média R̄u
Davi Caio (0, 0) 🎬 Matrix (+1, +2) 🎭 Titanic (−1, −2) "gostou muito" "odiou" θ ≈ 180° cos ≈ −1

🎯 A mágica do "adjusted": antes, todos os vetores apontavam para o mesmo quadrante positivo (porque todos os ratings são >0) — tudo parecia similar. Depois, subtrair a média do usuário (R̄u) revela o gosto real: acima da média = positivo, abaixo = negativo. Vetores opostos agora significam "gostos opostos" com cos ≈ −1.

Adjusted Cosine · Agora com Números
Calculando sim(Matrix, Inception) com a matriz da aula
1
Média por usuário
Ana=4.67 · R̄Caio=4.0
2
Desvios (R−R̄)
Re-centraliza na origem
3
Produto e normas
Só sobre usuários em comum
4
Cosseno ∈ [-1,1]
≈ +0.92 (alta!)

✅ Fecha com a intuição do slide anterior

O valor ≈ +0.92 confirma o que vimos geometricamente: Matrix e Inception estão em posições quase paralelas após o ajuste — usuários que gostam de um tendem a gostar do outro, acima da média pessoal.

Aplicado à matriz do slide 8
# Usuários que avaliaram AMBOS: Ana, Caio
Ana = (5+4+5)/3 = 4.67
Caio = (4+5+2+5)/4 = 4.00
# Desvios Matrix vs Inception
Ana : (54.67)·(44.67)
= 0.33 · (−0.67) = −0.22
Caio: (44.00)·(54.00)
= 0 · 1 = 0
# ... normalizar pelas normas
sim(Matrix, Inception)+0.92
Matriz Item × Item · O Superpoder do Item-based
Calcule uma vez, consulte milhões de vezes
S (5 × 5) — similaridade item-item pré-computada
Matrix
Incep.
Titanic
Inters.
Amelie
Matrix
1.00
+0.92
−0.78
+0.88
+0.12
Incep.
+0.92
1.00
−0.65
+0.85
+0.18
Titanic
−0.78
−0.65
1.00
−0.72
+0.81
Inters.
+0.88
+0.85
−0.72
1.00
+0.22
Amelie
+0.12
+0.18
+0.81
+0.22
1.00

⚡ Custo computacional

  • Offline: O(m² · n̄) — uma vez por dia/semana
  • Online: O(k) por consulta — quase grátis
  • User-based faria O(|U|² · |I|) por consulta

🧊 Estabilidade

A similaridade entre dois itens muda pouco ao longo do tempo (gostos de gênero são relativamente fixos). Já similaridade entre usuários muda rápido. Por isso item-item é cacheável.

🔍 Explicabilidade grátis

"Você viu Matrix, então recomendamos Inception porque são similares (sim=0.92)." — Item-based é naturalmente auditável.

Algoritmo de Predição
Dado um usuário u e um item i, qual rating ele daria?
Fórmula de predição ponderada
# soma ponderada sobre itens já consumidos
# cuja similaridade com i é positiva
P(u, i) =
  Σj ∈ N(u,i) sim(i, j) · Ru,j
  ───────────────────
  Σj ∈ N(u,i) |sim(i, j)|
N(u,i) = k vizinhos mais similares a i
que o usuário u já avaliou

🔑 Leia: média ponderada

O rating previsto é uma média dos ratings que o usuário deu a itens parecidos, com peso igual à similaridade. Itens muito parecidos puxam mais; pouco parecidos contribuem pouco.

🎚️ Top-k vizinhos

Na prática, não usamos todos os itens — só os k mais similares (tipicamente k=20 a 50). Melhora qualidade e custo.

🏆 Ranqueamento top-N

Para recomendar, calculamos P(u,i) para todos os itens não consumidos e devolvemos os N de maior score. Tipicamente N=10 ou 20.

Exemplo · Predizer Rating de Davi para Interstellar 🚀
Matriz R do slide 7 + matriz S do slide 10

📋 Dados

Davi já avaliou: Matrix (5), Titanic (1), Amelie (3).

Queremos prever: P(Davi, Interstellar).

Similaridades de Interstellar com os itens que Davi avaliou (da matriz S):

  • sim(Inters, Matrix) = +0.88
  • sim(Inters, Titanic) = −0.72
  • sim(Inters, Amelie) = +0.22

✅ Predição ≈ 4.6 · "Muito provável que curta"

Rating alto + similaridade forte com Matrix (que ele amou) → recomenda com confiança. Titanic (que ele odiou) reforça no sentido oposto, e isso é coerente.

Passo a passo
# filtro: somente sim > 0 na prática
# aqui usamos todos pra fidelidade
numerador =
0.88·5 + (−0.721 + 0.22·3
= 4.400.72 + 0.66 = 4.34
denominador =
|0.88| + |−0.72| + |0.22|
= 1.82
P(Davi, Inters) = 4.34 / 1.82
2.38 // escala bruta
# normalizando para escala 1-5:
P̂ ≈ 4.6
Amazon 2003 · Por que Item Venceu User
O paper que mudou a indústria de recomendação
We developed an algorithm called item-to-item collaborative filtering. Unlike other algorithms, it scales to massive data sets and produces high-quality recommendations in real time. — Linden, Smith & York · IEEE Internet Computing · 2003

🛒 "Quem comprou X também comprou Y"

Essa frase é a UX direta do item-based. Ela se tornou o padrão visual da recomendação online. Hoje aparece em Amazon, MercadoLivre, Shopee, Steam, AppStore.

🏗️ 4 razões da vitória

  • Escala: catálogo > 107 itens, >108 usuários
  • Tempo real: query em O(k) com matriz pré-computada
  • Qualidade: resultados mais estáveis e relevantes
  • Cold start parcial: usuário novo já pode receber recomendação após 1 compra

📊 Resultado de negócio

O widget "Customers who bought this also bought" é apontado como responsável por uma fatia relevante das 35% de vendas que a Amazon atribui ao sistema de recomendação.

Limitações do Item-based
Todo algoritmo tem pontos cegos — conhecê-los é engenharia

❄️ Cold Start (novo item)

Item novo sem ratings não tem vetor-coluna → não pode ser comparado a nada.

Mitigação: híbrido com content-based nos primeiros dias.

📈 Bias de Popularidade

Itens muito populares acumulam mais similaridades e dominam top-N.

Mitigação: penalização logarítmica, re-ranking por diversidade.

🕳️ Esparsidade

Se poucos usuários avaliaram ambos os itens, sim(i,j) é instável.

Mitigação: threshold mínimo de sobreposição; shrinkage.

🫧 Filter Bubble

Recomendações tendem ao "mais do mesmo" — reduz descoberta.

Mitigação: introduzir serendipity/diversity no ranqueamento.

🧭 Princípio de engenharia: em sistemas de recomendação, nunca basta melhorar a métrica offline. A experiência real do usuário depende de diversidade, novidade e explicabilidade. Monitore isso em produção com A/B tests.

Como Avaliar um Recomendador
Métricas offline · precision@k, recall@k, MAP, NDCG

🎯 Precision@k

Dos k itens que recomendei, quantos eram realmente relevantes?

P@k = |relevantes ∩ top-k| / k

🕸️ Recall@k

Dos itens relevantes para o usuário, quantos apareceram no meu top-k?

R@k = |relevantes ∩ top-k| / |relevantes|

📏 MAP — Mean Average Precision

Média da precisão em cada posição onde há um item relevante. Sensível à ordem.

📊 NDCG — Normalized DCG

peso maior para acertos no topo da lista. Padrão em sistemas ranqueados.

🧪 Além das offline

Em produção, use A/B tests com métricas de negócio (CTR, conversão, tempo de sessão). Offline ≠ online.

ML.NET · Do Algoritmo ao Código
Microsoft.ML.Recommender — o algoritmo da aula, agora executável em C# sem sair do .NET

⚙️ ML.NET em um parágrafo

Biblioteca oficial de machine learning da Microsoft, 100% nativa do .NET. Roda em CPU, sem Python, sem Docker, integrando direto em APIs ASP.NET Core.

# Pacotes NuGet
dotnet add package Microsoft.ML
dotnet add package Microsoft.ML.Recommender

🧭 Mapeamento da teoria

ML.NET resolve colaborativa via Matrix Factorization (LIBMF): aprende vetores latentes de dimensão k para cada user e cada item.

  • Predição (slide 11) ≈ u · i (produto escalar dos vetores)
  • Similaridade item-item (slide 12) ≈ cos(i₁, i₂) dos vetores aprendidos
  • k fatores ≈ gêneros/temas latentes que emergem do treino
1
Load
CSV → IDataView
2
Transform
IDs → chaves numéricas
3
Train
MatrixFactorizationTrainer
4
Predict
Rating + Top-N
C# · Treino do Recomendador
Do CSV ao modelo treinado em ~30 linhas — um único pipeline declarativo
using Microsoft.ML; using Microsoft.ML.Trainers; // 1 · Esquema: cada linha do CSV é (user, item, nota) public record Rating(float UserId, float ItemId, float Label); var ctx = new MLContext(seed: 42); // 2 · Load ratings.csv → IDataView var data = ctx.Data.LoadFromTextFile<Rating>( "ratings.csv", hasHeader: true, separatorChar: ','); // 3 · Pipeline: mapear IDs → chaves + Matrix Factorization var pipeline = ctx.Transforms.Conversion .MapValueToKey("UserIdEnc", "UserId") .Append(ctx.Transforms.Conversion .MapValueToKey("ItemIdEnc", "ItemId")) .Append(ctx.Recommendation().Trainers .MatrixFactorization(new MatrixFactorizationTrainer.Options { MatrixColumnIndexColumnName = "UserIdEnc", MatrixRowIndexColumnName = "ItemIdEnc", LabelColumnName = "Label", ApproximationRank = 16, // k fatores latentes NumberOfIterations = 20, LearningRate = 0.05 })); // 4 · Fit → ITransformer (modelo treinado) var model = pipeline.Fit(data);

🔢 MapValueToKey

IDs arbitrários (strings ou ints esparsos) viram chaves contíguas. É requisito do LIBMF.

🎛️ ApproximationRank

Quantos fatores latentes (k). 8–32 cobre a maioria dos casos. Mais rank = mais capacidade + risco de overfit.

⏱️ NumberOfIterations

Passos de SGD. Use model.Evaluate() num holdout para ajustar. Típico: 15–40.

🎚️ LearningRate

Passo do SGD. 0.05 é default seguro. Se RMSE estagna alto, aumente; se oscila, diminua.

C# · Prever Rating, Top-N e Similaridade Item↔Item
Modelo treinado → 3 operações que o app mobile vai consumir via API
// A · Predição pontual // "Qual rating Davi daria a Interstellar?" public class Prediction { public float Score; } var engine = ctx.Model .CreatePredictionEngine<Rating, Prediction>(model); var p = engine.Predict(new Rating { UserId = 4f, // Davi ItemId = 7f // Interstellar }); Console.WriteLine($"Rating previsto: {p.Score:F2}"); // B · Top-N para um usuário float userId = 4f; var ranking = catalogoItens .Select(id => (id, engine.Predict( new Rating { UserId = userId, ItemId = id }).Score)) .OrderByDescending(x => x.Score) .Take(10);
// C · Extrair fatores latentes dos itens // → recupera a matriz S do slide 12 var mf = (MatrixFactorizationModelParameters) ((TransformerChain<ITransformer>)model) .LastTransformer; mf.GetItemMatrix( out var items, // float[itemCount, k] out var _); // Cosseno entre linhas = similaridade item↔item static float Cos(float[] a, float[] b) { float dot=0, na=0, nb=0; for (int i=0; i<a.Length; i++) { dot += a[i]*b[i]; na += a[i]*a[i]; nb += b[i]*b[i]; } return dot / (MathF.Sqrt(na)*MathF.Sqrt(nb)); } // Vizinhos mais parecidos de um item i var vizinhos = TopKSimilar(items, itemIdx: 3, k: 5);

💡 Dica arquitetural: o PredictionEngine não é thread-safe. Em APIs ASP.NET Core, use PredictionEnginePool (pacote Microsoft.Extensions.ML) para injeção de dependência e escala. Modelo pode ser salvo com ctx.Model.Save(model, schema, "model.zip") e recarregado sem retreinar.

Este Sistema no RM-ODP · 5 Visões
O recomendador não é um algoritmo — é um sistema distribuído
🏢
Enterprise
Propósito: aumentar engajamento e conversão no app de recomendação
Stakeholders: usuários, PO, time de negócio · Política: recomendações auditáveis e diversas
📋
Information
Matriz R (usuário × item), matriz S (item × item), histórico de interações
Invariantes: rating ∈ [1,5], sim ∈ [-1,1], R esparsa · Persistência: PostgreSQL
⚙️
Computational
RecommenderService (online), SimilarityJob (offline), RatingController
Contratos: GET /recommendations/:userId → top-N; POST /ratings
🔧
Engineering
Job offline computa S diariamente; API lê S do cache (Redis); app consome via REST
Falhas previstas: timeout → fallback em popularidade; app offline → cache local
💻
Technology
React Native + dotnet API + PostgreSQL + Redis · Similaridade em Python/.NET batch
Testes: Jest (front), xUnit (back), métricas Precision@10 em CI
Conexão com o Projeto do Módulo
Do algoritmo ao app React Native · o que isso vira na sprint

🧱 Backend (dotnet)

  • Endpoint POST /ratings
  • Endpoint GET /recommendations/:userId?k=10
  • Job batch: recalcula matriz S
  • Cache da matriz em Redis

📱 App (React Native + MVVM)

  • Tela de descobrir: chama /recommendations
  • Tela de rating: envia /ratings
  • Exibe "porque você gostou de X"
  • Tratamento de loading/erro

🗄️ Banco (PostgreSQL)

  • Tabelas: user, item, rating
  • Tabela materializada: item_similarity
  • Índices em (user_id, item_id)
  • Stored Procedure para top-N (aula 4)

🔗 Onde esta aula se encaixa no módulo

Aula 1 (hoje): item-based · fundamento matemático. Aula 2: visão geral de filtragem colaborativa (user-based + item-based). Aula 3: SOA e requisitos não funcionais. Aula 4: Stored Procedures e Functions. Aulas 5+: implementação (Transactions, MVVM, TDD, testes, boas práticas, monitoramento).

Entregas da Sprint 1 📦
4 artefatos obrigatórios · todos com prazo na Semana 02
01
📅 Semana 02

🧭 Entendimento do Projeto e do Negócio

Minimundo, atores, objetivo de negócio e escopo. Quem usa, por que, e o que está fora desta sprint.

02
📅 Semana 02

📋 Especificação de RF e RNF

Requisitos funcionais priorizados + RNF por eixo (ISO/IEC 25010) + regras de negócio numeradas.

03
📅 Semana 02

🗄️ Base de Dados para Modelo de Recomendação

Modelo de dados inicial + dataset de usuários/itens/ratings capaz de alimentar o algoritmo item-based.

04
📅 Semana 02

🛠️ Gestão de Projeto e Configuração

Repositório com template aplicado, issues, branches, board da sprint e rotina de reuniões definida.

✅ Critérios transversais: rastreabilidade RF → RN → RNF sem lacunas · decisões técnicas documentadas no repositório · conventional commits + Merge Requests obrigatórios · todos os membros com ao menos 1 contribuição visível no board.

🧪
Mão na massa · Seu Primeiro Recomendador
Com o grupo, construa uma planilha (Google Sheets ou Excel) simulando o domínio do seu app e calcule duas recomendações item-based manualmente.
1️⃣ Definir 5 usuários e 5 itens do seu domínio
2️⃣ Preencher ratings plausíveis (alguns vazios!)
3️⃣ Calcular média de cada usuário (R̄u)
4️⃣ Adjusted cosine entre 2 itens escolhidos
5️⃣ Previsão de rating com a fórmula ponderada
6️⃣ Comentário crítico: o resultado faz sentido?
7️⃣ Aplicar o template no repositório do grupo
💡 Use o resultado na reunião da próxima aula — vai virar insumo do artefato da sprint.
Horário de Desenvolvimento · Workshop do Parceiro 📝
Preparação coordenada · sem perguntas duplicadas ou sombreadas entre grupos
PASSO 1

📖 Reler o TAPI

Releia o TAPI do parceiro em grupo. Marque trechos ambíguos, decisões não justificadas e lacunas técnicas.

PASSO 2

💡 Consolidar a aula

Liste dúvidas que surgiram no exercício de item-based. O que vocês precisam confirmar com o parceiro para modelar o domínio?

PASSO 3

✍️ Formular perguntas

Prefira perguntas abertas e específicas a perguntas sim/não. Cada pergunta deve justificar por que importa para o projeto.

PASSO 4

📊 Registrar no Sheets

Adicione as perguntas no Google Sheets da sala. Antes de escrever: leia todas as perguntas existentes.

🚫 Proibido: perguntas duplicadas · perguntas que "sombreiam" (mesma intenção, palavras diferentes) · perguntas genéricas tipo "qual o maior desafio?". Se um grupo já perguntou algo parecido, aprofunde a existente em vez de repetir.
Boas perguntas: trazem contexto ("no cenário X, ..."), pedem exemplo concreto, questionam uma decisão ("por que Y e não Z?") ou investigam uma restrição ("o que acontece se o volume crescer 10×?").
🎯
O que ficou de hoje
Item-based é um dos algoritmos mais importantes da engenharia de software do último quarto de século. Na aula 2 voltamos com a visão geral unificando user-based e item-based.
✅ Problema da descoberta
✅ Tipos de recomendadores
✅ Matriz R (linha vs coluna)
✅ Adjusted cosine
✅ Matriz S pré-computada
✅ Predição ponderada
✅ Amazon 2003
✅ Limitações
✅ RM-ODP aplicado
Módulo 6 · Engenharia de Software · Aula 1 de 10