Algoritmo de correspondência de preferências

12

Há um projeto paralelo no qual estou trabalhando, onde preciso estruturar uma solução para o seguinte problema.

Eu tenho dois grupos de pessoas (clientes). O grupo Apretende comprar e o grupo Bpretende vender um determinado produto X. O produto tem uma série de atributos x_i, e meu objetivo é facilitar a transação entre Ae Bcombinando suas preferências. A idéia principal é apontar para cada membro de Aum correspondente Bcujo produto se adapte melhor às suas necessidades e vice-versa.

Alguns aspectos complicadores do problema:

  1. A lista de atributos não é finita. O comprador pode estar interessado em uma característica muito particular ou algum tipo de design, o que é raro entre a população e não posso prever. Não é possível listar todos os atributos anteriormente;

  2. Os atributos podem ser contínuos, binários ou não quantificáveis ​​(ex: preço, funcionalidade, design);

Alguma sugestão de como abordar esse problema e resolvê-lo de forma automatizada?

Também agradeceria algumas referências a outros problemas semelhantes, se possível.


Ótimas sugestões! Muitas semelhanças com a maneira como estou pensando em abordar o problema.

A principal questão no mapeamento dos atributos é que o nível de detalhe ao qual o produto deve ser descrito depende de cada comprador. Vamos dar um exemplo de um carro. O produto "carro" possui muitos atributos que variam de desempenho, estrutura mecânica, preço etc.

Suponha que eu só queira um carro barato ou um carro elétrico. Ok, é fácil mapear, porque eles representam os principais recursos deste produto. Mas digamos, por exemplo, que eu quero um carro com transmissão de dupla embreagem ou faróis de xenônio. Bem, pode haver muitos carros na base de dados com esses atributos, mas eu não pediria ao vendedor que preenchesse esse nível de detalhe do produto antes da informação de que há alguém procurando por eles. Tal procedimento exigiria que todo vendedor preencha um formulário complexo e muito detalhado, apenas tente vender seu carro na plataforma. Só não funcionaria.

Ainda assim, meu desafio é tentar ser o mais detalhado possível na busca para fazer uma boa correspondência. Então, a minha maneira de pensar é mapear os principais aspectos do produto, aqueles que provavelmente são relevantes para todos, para diminuir o grupo de possíveis vendedores.

O próximo passo seria uma "pesquisa refinada". Para evitar a criação de um formulário muito detalhado, eu poderia pedir aos compradores e vendedores que escrevessem um texto livre de suas especificações. E, em seguida, use algum algoritmo de correspondência de palavras para encontrar possíveis correspondências. Embora eu entenda que essa não é uma solução adequada para o problema, porque o vendedor não pode "adivinhar" o que o comprador precisa. Mas pode me aproximar.

Os critérios de ponderação sugeridos são ótimos. Permite-me quantificar o nível em que o vendedor corresponde às necessidades do comprador. A parte de dimensionamento pode ser um problema, porque a importância de cada atributo varia de cliente para cliente. Estou pensando em usar algum tipo de reconhecimento de padrão ou apenas pedir ao comprador para inserir o nível de importância de cada atributo.

RD
fonte

Respostas:

9

Minha primeira sugestão seria mapear de alguma forma os atributos não quantificáveis ​​para quantidades com a ajuda de funções de mapeamento adequadas. Caso contrário, simplesmente deixe-os de fora.

Em segundo lugar, não acho que você precise assumir que a lista de atributos não é finita. Uma abordagem padrão e intuitiva é representar cada atributo como uma dimensão individual em um espaço vetorial. Cada produto é simplesmente um ponto nesse espaço. Nesse caso, se você deseja adicionar dinamicamente mais atributos, basta remapear os vetores do produto para o novo espaço de recurso (com dimensões adicionais).

Com essa representação, um vendedor é um ponto no espaço de recurso com atributos do produto e um comprador é um ponto no mesmo espaço de recurso com os atributos de preferência. A tarefa é descobrir o ponto de comprador mais semelhante para um determinado ponto de vendedor.

Se o seu conjunto de dados (ou seja, o número de compradores / vendedores) não for muito grande, você poderá resolver isso com uma abordagem de vizinho mais próximo implementada com a ajuda de árvores kd.

Para dados de tamanho muito grande, você pode adotar uma abordagem de IR. Indexar o conjunto de vendedores (ou seja, os atributos do produto) tratando cada atributo como um termo separado, com o peso do termo definido como o valor do atributo. Uma consulta nesse caso é um comprador que também é codificado no termo espaço como um vetor de consulta com pesos de termo apropriados. A etapa de recuperação retornará uma lista das K correspondências mais semelhantes.

Debasis
fonte
Wright. A questão principal aqui é o número de dimensões, ou seja, o nível de detalhe que preciso usar. Você poderia me esclarecer a "abordagem de RI".
RD
1
Por RI, eu quis dizer Recuperação de Informação. Você pode pensar que os documentos (vendedores) em sua coleção e a consulta (um comprador) são todos vetores incorporados em um espaço de termo (atributo). Como eu disse, essa abordagem precisa de um número predefinido de dimensões para trabalhar.
Debasis
7

Como sugerido, enlouquecendo . Antes de tudo, corrija-me se estiver errado:

  • Existem apenas alguns recursos para cada produto exclusivo;
  • Não existe uma lista definitiva de recursos, e os clientes podem adicionar novos recursos a seus produtos.

Nesse caso, a construção de uma tabela completa de recursos do produto pode ser cara em termos de computação. E a tabela final de dados seria extremamente esparsa.

O primeiro passo é restringir a lista de clientes (produtos) para correspondência. Vamos criar um gráfico bipartido, em que os vendedores sejam nós do tipo 1 e os compradores sejam nós do tipo 2. Crie uma vantagem entre qualquer vendedor e comprador toda vez que ele fizer referência a um recurso de produto semelhante, como no esboço a seguir:

gráfico

Usando o gráfico acima, para cada produto de vendedor exclusivo, você pode selecionar apenas compradores interessados ​​em recursos que correspondam ao produto (é possível filtrar pelo menos um recurso comum, corresponder ao conjunto completo de recursos ou definir um nível limite). Mas, certamente, isso não é suficiente. O próximo passo é comparar os valores dos recursos, conforme descrito pelo vendedor e comprador. Existem muitas variantes (por exemplo, k-vizinhos mais próximos). Mas por que não tentar resolver esta questão usando o gráfico existente? Vamos adicionar pesos às arestas:

  • para recursos contínuos (por exemplo, preço):

    price_weight

  • para recursos binários e não quantificáveis ​​- apenas bicondicional lógico:

    feature_weight

A idéia principal aqui é dimensionar todos os recursos para o intervalo [0, 1]. Além disso, podemos usar os coeficientes de recurso para determinar os recursos mais importantes. Por exemplo, supondo que o preço seja duas vezes mais importante que a disponibilidade de alguma função rara:

adj_w_1

adj_w_2

Uma das etapas finais é simplificar a estrutura do gráfico e reduzir muitas arestas para uma aresta com peso igual à soma dos pesos calculados anteriormente de cada recurso. Com uma estrutura tão reduzida, cada par de clientes / produtos poderia ter apenas uma aresta (sem arestas paralelas). Portanto, para encontrar a melhor oferta para o vendedor exato, basta selecionar compradores conectados com arestas ponderadas máximas.

Desafio futuro: introduza um método barato para ponderar arestas na primeira etapa :)

sobach
fonte