WedX - журнал о программировании и компьютерных науках

Как агрегировать один столбец по другому столбцу в MATLAB?

У меня есть файл .mat, в котором две колонки "Продукт" и "Клиент". Номер клиента повторяется столько раз, сколько он приобрел разных товаров. Таблица выглядит так:

  Product Customer    
      114        1    
      112        2    
      112        1   
      113        4    
      115        3    
      113        2   
      111        2    
      113        3

А мне нужно сделать так:

    Customer 111 112 113 114 115
           1   0   1   0   1   0
           2   1   1   1   0   0
           3   0   0   1   0   1
           4   0   0   1   0   0

В новой таблице должен быть столбец «Клиент» и еще пять столбцов для каждого продукта, и если клиент «1» купил продукт «112», должен быть 1 показатель, если он не купил, он должен быть 0. Как я могу это сделать с МАТЛАБ? Любая помощь будет очень приятно!


  • Данные вашего примера не включают это, но как насчет нескольких покупок? Каким будет результат, если клиент 1 купит 112 три раза? 10.04.2015
  • Да, я забыл упомянуть, что если клиент купил один и тот же товар три раза, было бы идеально, если бы их было 3, а не 1. 10.04.2015
  • Спасибо, думаю получится :) 10.04.2015
  • На самом деле он не работает так, как должен. Я делаю это так: sparse(Customer, Product, 1). Разреженная матрица в данном случае 4x115, а должна быть 4x5. Он делает столбцы с 1 по 115, а не со 111, как предполагалось. 10.04.2015
  • @knedlsepp Это тоже было моим предложением! :-) 10.04.2015

Ответы:


1

Это классический случай для accumarray.

>> product = [114, 112, 112, 113, 115, 113, 111, 113]';
>> customer = [1, 2, 1, 4, 3, 2, 2, 3]';
>> [~,~,ic] = unique(product);
>> accumarray([customer, ic], 1)

ans =

     0     1     0     1     0
     1     1     1     0     0
     0     0     1     0     1
     0     0     1     0     0

Здесь мы используем unique для определения уникальных идентификаторов продуктов, а третий вывод — это сопоставление вектора product с уникальным идентификатором.

10.04.2015
  • А как бы вы справились с несколькими покупками? 10.04.2015
  • @kkuilla, кажется, отлично работает для меня, даже когда есть несколько покупок. 10.04.2015
  • @ Benoit_11 Да, ты прав. Я должен был сначала испытать это на себе. Я думаю, что это отличное решение. 10.04.2015
  • Да, это определенно именно то, для чего предназначен accumarray — также обратите внимание, что второй аргумент может быть вектором — поэтому, если бы был третий столбец количества покупок, вы могли бы поместить его туда. 10.04.2015

  • 2

    Скажем, N_of_pr — это общее количество продуктов, N_of_cus — это общее количество клиентов, а tab — это первая таблица из двух столбцов, которая у вас есть. Результирующая бинарная матрица M

    pr=zeros(1,N_of_pr);
    cus=zeros(1,N_of_cus);
    
    s=size(tab);
    
    for j=1:s(1)
        pr(tab(j,1))=1;
        cus(tab(j,2))=1;
    end;
    
    [X,Y]=meshgrid(pr,cus);
    
    M=X.*Y;
    
    10.04.2015
  • Спасибо за ответ, но он не работает, когда я пробую этот код, я получаю Недостаточно памяти. Введите HELP MEMORY для ваших вариантов. Я пытался сделать это всего двумя строками, но все равно получаю эту ошибку, не может быть, что у меня нет места на моем компьютере... 10.04.2015

  • 3

    Вы можете использовать базовые команды MATLAB, такие как sparse

    table = sparse(Customer, Product, 1);
    

    или что-то вроде grpstats из панели инструментов статистики.

    t = table(Product, Customer);
    grpstats(t, {'Customer','Product'})
    

    Это не дает именно той таблицы, которую вы хотите, но я думаю, вы все равно можете достичь своей цели.

    Существует также отправка под названием pivottable на файловом обмене, которая будет делать то, что вы хочу:

    pivottable([Customer, Product, ones(size(Product))], 1, 2, 3, @sum)
    
    10.04.2015
  • спасибо за ответ, я хотел бы использовать команду sparse, потому что моя реальная таблица намного больше, чем эта, это только ее часть. Таким образом, sparse сэкономит ту же память, но, как я писал в первом ответе, если я использую sparse, тогда он создает столбцы 115 вместо 5... 10.04.2015
  • @MiglėPapuškaitė: у вас не может быть столбцов, начинающихся с 111. Вам придется либо перенумеровать идентификаторы продуктов с 1 на 5, используя [~, Product]=unique(Product), либо просто оставить все как есть. (С точки зрения памяти это не имеет большого значения, если вы хотите сохранить 111, вам, вероятно, следует просто использовать sparse.) 10.04.2015
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: wedx@cp9.ru