Как определить похожесть комплектации автомобиля?

Добрый день!

Имеется датасет комплектациий автомобилей:
- ID
- Бренд
- Модель
- Поколение
- Тип Двигателя
- Объем двигателя
- Количество цилиндров
- Тип кузов
- Тип коробки передач
- Код двигателя
- Год выпуска

Задача:
Требуется определить как одна комплектация похожа на другую.

Я предполагал представить каждую запись в датасете как вектор, и посчитать косинусную схожесть между векторами.

Но есть недопонимаем каким образом представить в численном виде значения например Тип Кузова: седан, кроссовер, купе и тд

Спасибо за помощь

Code SQL
with "norm" as not materialized (
select
"id" as "id",
(("yearStart" - "a"."yearStart.min")::numeric / "a"."yearStart.d") as "yearStart",
(("cylindersVolumeLiters" - "a"."cylindersVolumeLiters.min")::numeric / "a"."cylindersVolumeLiters.d") as "cylindersVolumeLiters",
(("enginePower" - "a"."enginePower.min")::numeric / "a"."enginePower.d") as "enginePower",
(("cylindersNumber" - "a"."cylindersNumber.min")::numeric / "a"."cylindersNumber.d") as "cylindersNumber",
(("valvesNumber" - "a"."valvesNumber.min")::numeric / "a"."valvesNumber.d") as "valvesNumber"
from
normative_reference.erp_car
left join lateral (
select
min("yearStart") as "yearStart.min",
(max("yearStart")-min("yearStart"))::numeric as "yearStart.d",
min("cylindersVolumeLiters") as "cylindersVolumeLiters.min",
(max("cylindersVolumeLiters")-min("cylindersVolumeLiters"))::numeric as "cylindersVolumeLiters.d",
min("enginePower") as "enginePower.min",
(max("enginePower")-min("enginePower"))::numeric as "enginePower.d",
min("cylindersNumber") as "cylindersNumber.min",
(max("cylindersNumber")-min("cylindersNumber"))::numeric as "cylindersNumber.d",
min("valvesNumber") as "valvesNumber.min",
(max("valvesNumber")-min("valvesNumber"))::numeric as "valvesNumber.d"
from
normative_reference.erp_car ) as "a" on
true
)
insert into normative_reference.erp_car_matrix_similarity
select
"car"."brandId" as "brandId",
"car"."id" as "carId",
"r"."id" as "relatedCarId",
cos_similarity_vector(
array[1, 1, 1, 1, 1, 1, "norm.car"."yearStart", "norm.car"."cylindersVolumeLiters", "norm.car"."enginePower", "norm.car"."cylindersNumber", "norm.car"."valvesNumber"], 
array[
case when r."generationId" = "car"."generationId" then 1 else 0 end,
case when r."modelId" = "car"."modelId" then 1 else 0 end,
case when r."brandId" = "car"."brandId" then 1 else 0 end,
case when r."fuelType" = "car"."fuelType" then 1 else 0 end,
case when r."engineCode" = "car"."engineCode" then 1 else 0 end,
case when r."workshopId" = "car"."workshopId" then 1 else 0 end,
"norm.relatedCar"."yearStart",
"norm.relatedCar"."cylindersVolumeLiters",
"norm.relatedCar"."enginePower",
"norm.relatedCar"."cylindersNumber",
"norm.relatedCar"."valvesNumber"
]
) as "similarity"
from normative_reference.erp_car as "car"
cross join normative_reference.erp_car as "r"
left join "norm" as "norm.car" on "norm.car"."id" = "car"."id"
left join "norm" as "norm.relatedCar" on "norm.relatedCar"."id" = "r"."id"
  • Вопрос задан
  • 424 просмотра
Пригласить эксперта
Ответы на вопрос 3
mayton2019
@mayton2019
Bigdata Engineer
Я предполагал представить каждую запись в датасете как вектор, и посчитать косинусную схожесть между векторами.

Косинусная здесь не подходит. Косинус учитывает вес каждого параметра. Например слова "шалаш" и "кабан"
содержат по 2 буквы "а" и это делает возможным введение косинусной метрики для дистанции двух слов.

У тебя автомобили содержат просто булевы признаки. Например тип_двигателя_дизель = true.
И сравнивать тебе выгоднее просто векторы такого вида { 1.0, 0.0, 1.0, 0.0 .... },
Тут дистанция хемминга была бы проще и вернее.

По поводу объема двигателя и года выпуска - решай сам. Но при численном сравнении
у тебя возникнет дилемма крокодила. Типа крокодил более зеленый чем плоский? Или наоборот.
Грубо говоря какой из параметров будет иметь БОЛЬШИЙ вес в при операциях сравнения.
Ответ написан
Комментировать
Нужно ввести метрики расстояния на каждую категорию (ID опускаем).
Признаки могут быть количественными и категориальными.
Код двигателя нужно расшифровать на несколько отдельных категорий и для каждой в отдельности также составить метрику расстояния.
Чем меньше совокупность расстояний, тем ближе к эталонной модели.
Ответ написан
Комментировать
@basili4-1982
Мне как видится тут следует искать совпадения. Ну. т.е. если полное совпадение считается как похожее. Тогда мы можем сказать что комплектация у которой не совпадает 1 параметр чуть менее похожа, 2 параметра еще менее похожа. И так до полностью не похожей.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы