Вопрос или проблема
Я не уверен, как правильно сформулировать этот вопрос и с чего начать. Я новичок в области аналитики данных, но стремлюсь развить свои навыки и знания.
Пример того, о чем я спрашиваю, заключается в том, если у вас есть данные о продажах розничного продавца, где указана общая стоимость определенной транзакции и детали каждого товара, связанного с данной транзакцией, но отсутствуют данные о цене каждого отдельного товара, возможно ли оценить стоимость каждого товара, если у вас достаточно большой набор данных о транзакциях?
Аналогия немного ломается для рассматриваемого мной случая, поскольку в рамках этого примера с розничным продавцом товар, вероятно, будет иметь фиксированную цену. Однако в моем случае каждый товар имеет известную произвольную тарифную стоимость, но неизвестную фактическую стоимость. Мы будем знать только агрегированную фактическую стоимость вместе с другими товарами, которые могут быть сгруппированы под одной “транзакцией”. Тарифные и фактические стоимости, вероятно, будут иметь сильную линейную корреляцию с некоторой вариативностью, хотя фактические значения для отдельных товаров не фиксируются.
Надеюсь, это имеет смысл! Я хотел бы узнать, как определить эту задачу, какой подход вы бы выбрали для решения подобной проблемы? И любые ссылки на связанные материалы будут очень полезными.
Очевидно, что эта проблема не всегда имеет единственное решение, но если вы заинтересованы в поиске одного возможного решения, вы можете попробовать простую симуляцию генетического алгоритма:
- Каждый отдельный ген представляет собой товар из списка всех возможных товаров.
- Каждому гену/товару сначала случайным образом присваивается цена (экспрессия гена).
- При применении мутации к гену/товару его цена немного случайным образом изменяется.
- Кроссовер приводит к тому, что “дочерний ген” получает значение, равное среднему из двух “родительских генов”.
Это условие означает, что каждый индивидуум в популяции состоит из всех товаров с присвоенной определенной ценой. На каждом поколении каждый индивидуум/назначение оценивается путем применения назначений цен к фактическим данным и затем измерения ошибки по сравнению с фактическими ценами. В конце концов, выбираются лучшие N индивидуумов/назначений, которые показывают наилучшие результаты, в качестве родителей для следующего поколения. В конечном итоге популяция должна сходиться к реалистичным назначениям цен.
Я думаю, что это идеальный случай для генетического алгоритма, потому что оценка потенциального назначения цены является очень простой задачей, поэтому нет серьезной проблемы с эффективностью при повторении процесса на протяжении многих поколений (в отличие от многих проблем, где оценка является чрезмерно дорогой).
Эта проблема является линейной программой!
Ее можно сформулировать как:
\begin{equation*}\begin{aligned}& \underset{x}{\text{max}}& & 0 \\& \text{при условии}& & N(\mathbf{x + c_{tarriff}}) = \mathbf{p}\\& & & \mathbf{x_i} \geq 0\end{aligned}\end{equation*}
Решатель, ожидающий вашу задачу в стандартной форме, будет ожидать от вас ввода
\begin{equation*}\begin{aligned}& \underset{x}{\text{max}}& & 0 \\& \text{при условии}& & N\mathbf{x} = \mathbf{p} – N\mathbf{c_{tarriff}}\end{aligned}\end{equation*}
Где все, кроме $\mathbf{x}$, является известной константой, а условие положительности на $\mathbf{x}$ является явным.
Объяснение:
Тарифы: $\mathbf{c_{tarriff}}$ — это вектор, где $\mathbf{c_{i}}$ — тарифная стоимость для каждого товара.
Цена за единицу: $\mathbf{x}$ — это вектор и единственная переменная в задаче. $\mathbf{x_{i}}$ — цена за единицу товара $i$, исключая тариф. Таким образом, $(\mathbf{x + c_{tarriff}})_i$ — это общая цена за единицу каждого товара.
Стоимость за транзакцию: $\mathbf{p}_j$ — это общая цена, уплаченная в транзакции $j$.
Стоимость для одной транзакции: Если у вас есть вектор $\mathbf{n}$, где $\mathbf{n}_i$ — количество раз, когда товар $i$ был куплен в транзакции, то $\mathbf{n} \cdot (\mathbf{x + c_{tarriff}}) = p_{transaction}$
Матрица количества по транзакциям: Мы можем объединить все эти векторы $\mathbf{n}$ в матрицу $N$, где $N_{ji}$ — это количество товара $i$, купленного в транзакции $j$. Это означает, что $N (\mathbf{x + c_{tarriff}}) = \mathbf{p}$, цена за все транзакции.
Когда решение уникально?
Если $N$ имеет полную строковую ранг, то цены могут быть определены уникально. В противном случае будет аффинное подпространство расстановок цен, которые удовлетворяют ограничению.
Другие замечания:
Мы пишем максимум по x с функцией стоимости, чтобы выразить задачу о осуществимости. Мы хотим только рассчитывать цены для каждого товара, которые удовлетворяют нашим равенственным ограничениям. У нас нет другого способа предпочесть разные комбинации цен.
Ответ или решение
Для оценки стоимости отдельных компонентов (или товаров) на основе общей стоимости транзакции в ситуации, когда известны лишь агрегированные данные, можно применить методы линейного программирования или эволюционные алгоритмы, такие как генетические алгоритмы. Давайте рассмотрим оба подхода более подробно.
Метод Линейного Программирования
Обозначим:
- ( \mathbf{c_{tarriff}} ) – вектор, где каждый элемент ( \mathbf{c_{i}} ) представляет собой тариф для соответствующего товара.
- ( \mathbf{x} ) – вектор, где ( \mathbf{x_{i}} ) — это стоимость единицы товара ( i ) без учета тарифа.
- ( \mathbf{p}_{j} ) – вектор, представляющий общую сумму, уплаченную за транзакцию ( j ).
- ( N ) – матрица транзакций, где ( N_{ji} ) обозначает количество товара ( i ), купленного в транзакции ( j ).
В такой ситуации задача может быть сформулирована следующим образом:
- Нам необходимо решить систему линейных уравнений:
[
N (\mathbf{x} + \mathbf{c_{tarriff}}) = \mathbf{p}
]
- Чтобы решить эту систему, нам нужно выразить ( \mathbf{x} ):
[
N \mathbf{x} = \mathbf{p} – N \mathbf{c_{tarriff}}
]
А затем, если матрица ( N ) полнорнранговая (имеет полный ранг), то системы уравнений будет иметь единственное решение. В противном случае, решения будут находиться в аффинном подпространстве.
Метод Генетических Алгоритмов
В случае, если структура данных более сложна или не дает возможности найти множество решений, можно применить генетические алгоритмы для оценки цен. Этот подход заключается в следующем:
- Каждая "особь" в популяции представляет собой набор цен для всех товаров.
- Изначально цены назначаются случайно.
- При применении мутации цена каждого товара немного изменяется случайным образом.
- При кроссовере цена "потомка" берется как среднее значение цен двух родителей.
С каждым поколением особи оценивались по критерию ошибки между рассчитанными и фактическими значениями транзакций. Постепенно алгоритм будет сходиться к более реалистичным значениям цен.
Заключение
Эти два подхода предлагают разные преимущества в зависимости от характеристики ваших данных. Линейное программирование может дать точное решение при наличии достаточного количества информации, в то время как генетические алгоритмы обеспечивают гибкость и возможность поиска в сложных или шумных данных.
Если вы хотите углубиться в эту тему, я рекомендую следующие материалы:
- Линейное Программирование: "Introduction to Linear Optimization" от Dimitris Bertsimas и John Tsitsiklis.
- Генетические Алгоритмы: "Genetic Algorithms in Search, Optimization, and Machine Learning" от David E. Goldberg.
Эти ресурсы помогут вам лучше понять методы и их применение в анализе данных.