Формализуйте вашу проблему, не взламывайте какой-либо код.
K-means минимизирует сумму квадратов.Если функции имеют разные масштабы, они по-разному влияют на оптимизацию.Поэтому вам тщательно необходимо выбрать веса (коэффициенты масштабирования) каждой переменной, чтобы сбалансировать их значимость так, как вы хотите (и обратите внимание, что 2-кратный коэффициент масштабирования не делает переменную в два раза большеважно).
Для DBSCAN расстояние - только двоичное решение: достаточно близко или нет.Если вы используете версию GDBSCAN, это легче понять, чем с расстояниями.Но со смешанными переменными я бы предложил использовать максимальную норму.Два объекта затем закрываются, если они различаются по каждой переменной не более чем на «eps».Вы можете установить eps = 1 и масштабировать свои переменные так, чтобы 1 была «слишком большой» разницей.Например, в дискретных переменных вы можете захотеть допустить один или два дискретных шага, но не три.
Логически легко увидеть, что порог максимального расстояния разлагается на дизъюнкцию предложений с одной переменной:
maxdistance(x,y) <= eps
<=>
forall_i |x_i-y_i| <= eps