двудольная сеть. Сохраняющая степень рандомизация с ограничениями.

Я работаю над выборкой данных, содержащей несколько статей, темы, к которым они относятся, и годы публикации этих статей, это выглядит так:

Я пытаюсь перетасовать годы публикации этих статей (оставьте количество статей по каждой теме и публикуемых в каждом году постоянным) в качестве подготовки к нулевой модели. Если без ограничений, это можно сделать проще с помощью. Но я хочу убедиться, что перетасованные годы этих статей остались в пределах периода соответствующих тем. Например, есть статьи по теме 1, опубликованные в 1995, 1996 и 1997 годах, поэтому перетасованные годы всех статей по теме 1 остаются периодом с 1995 по 1997 год. Точно так же тема 0 в [1991,1998], тема 2 в [1995], темы 3 в [1991,1992] и темы 4 в [1993,1997].

Я просматривал веб-страницы и статьи об этом, я думаю, что этот вопрос можно смоделировать как двустороннюю сетевую рандомизацию с сохранением степени с ограничениями. В этой двусторонней сети используются два типа узлов: topic и pub_year, а пример сети представлен на следующем рисунке:

пример сети

Чтобы перетасовать ссылки в этой двусторонней сети, я попробовал используя питон. Так что я могу гарантировать степень тематики и годы (но это не отличается от ?). Но насколько я знаю, не принимает никаких ограничений. В этом примере tp1 имеет ссылки на y1 и y2. Итак, в желаемой перетасованной сети tp1 не может иметь ссылок на y3 и y4. Точно так же нет связей между (tp2,y4), (tp3,y1/y3), (tp4,y1/y2).

Я хотел бы знать, иду ли я в правильном направлении, т.е. моделирую эту задачу как проблему двусторонней перестановки сети. Если да, то есть ли какой-нибудь инструмент, который я могу использовать для этой задачи?

1 ответ

Простой скрипт для перетасовки:

      import random

# replace it with your data
papers = [
    {"paper_id": 2031361154, "topic": 0, "year": 1998},
    {"paper_id": 2088633475, "topic": 1, "year": 1995},
    {"paper_id": 1987003396, "topic": 2, "year": 1995},
    {"paper_id": 2246118404, "topic": 3, "year": 1992},
    {"paper_id": 2017547909, "topic": 1, "year": 1996},
    {"paper_id": 2032449907, "topic": 4, "year": 1993},
    {"paper_id": 2053684599, "topic": 0, "year": 1991},
    {"paper_id": 1968369145, "topic": 1, "year": 1997},
    {"paper_id": 2160198778, "topic": 4, "year": 1997},
    {"paper_id": 2026639487, "topic": 3, "year": 1991}
]

topicRanges = {}
for paper in papers:
    topic = paper["topic"]
    if topic in topicRanges:
        topicRanges[topic] = {
            "min": min(paper["year"], topicRanges[topic]["min"]),
            "max": max(paper["year"], topicRanges[topic]["max"])
        }
    else:
        topicRanges[topic] = {"min": paper["year"], "max": paper["year"]}

shuffled = []
for paper in papers:
    topic = paper["topic"]
    topicRange = topicRanges[topic]
    year = random.randint(topicRange["min"], topicRange["max"])
    shuffled.append(
        {"paper_id": paper["paper_id"], "topic": topic, "year": year})

print(shuffled)
Другие вопросы по тегам