K-означает кластеризацию нескольких измерений - PullRequest
0 голосов
/ 09 мая 2018

Я работаю над алгоритмом кластеризации K-средних. Доступно множество примеров, но я не могу найти пример, который объясняет, что я пытаюсь сделать.

Мой набор данных содержит клиентов и их покупки. Каждый 1 в наборе данных означает, что клиент купил этот товар. 0 означает не купленный.

0,0,0,0,1,0,1,0,0,1
1,0,0,1,0,0,0,1,1,0
1,1,0,0,0,0,0,0,0,0
0,0,0,0,1,1,1,0,0,0

Слева направо представляют различные элементы. Сверху вниз представляют клиентов. Я хочу объединить клиентов. Таким образом, в наборе данных 4 измерения и будет 10 точек.

Теперь я пытаюсь создать точки из этого набора данных для следующих шагов. Я хочу создать список, содержащий все точечные объекты, а затем назначить их нужным кластерам, но я не знаю, как обрабатывать 4 различных измерения при создании точечного объекта.

class Point
{
    public int ClusterNumber { get; set; }
    public int X { get; set; }
    public int Y { get; set; }

    public Point(int clusterNumber, int CustomerId, int ProductId)
    {
        ClusterNumber = clusterNumber;
        X = CustomerId;
        Y = ProductId;
    }
}

1 Ответ

0 голосов
/ 09 мая 2018

Точка в этой конкретной проблеме k-средних - это набор продуктов, купленных покупателем. У вас есть четыре покупателя с их списком купленных предметов, так что это будет примерно так:

public class CustomerPoint
{
    public int CustomerId { get; set; }
    public ISet<int> ProductIds { get; set; }
}

Тогда точка кластера будет некоторой абстрактной точкой (не такой, как в ключевом слове abstract c #), например:

public class ClusterPoint
{
    public int ClusterNumber { get; set; }
    public IDictionary<int, float> ProductWeights { get; set; }
}

ProductWeights будет словарём, который отображает CustomerId в значение от 0 до 1 (включая оба), что указывает на то, был ли этот продукт куплен или нет. Расстояние между ClusterPoint и CustomerPoint будет разницей между весом товара и тем, что покупатель покупал товар или нет. «Расстояние» будет рассчитано для всех продуктов, и сумма этих расстояний приведет к общему расстоянию, которое вы должны минимизировать. Если у вас есть две точки кластера CLP(0.4, 0.1, 0.8, 0.5) и CLP(0.2, 0.7, 0.9, 0.9) и у вас есть клиент CUP(0, 1, 1, 0), различия будут следующими:

CLP1:
    |0 - 0.4|² = 0.16
    |1 - 0.1|² = 0.81
    |1 - 0.8|² = 0.04
    |0 - 0.5|² = 0.25
               ------
                 1.26
CLP2:
    |0 - 0.2|² = 0.04
    |1 - 0.7|² = 0.09
    |1 - 0.9|² = 0.01
    |0 - 0.9|² = 0.81
               ------
                 0.95

Таким образом, клиент «ближе» ко второй точке кластера, поэтому ему назначается эта точка.

Возможно, вы также можете изменить свойство CustomerPoint.ProductIds на значение IDictionary<int, float> и использовать значения 1 и 0 для "купленного предмета" или нет. Но это детали реализации.

...