Как классифицировать группы псевдонимов для идентификации одного человека - PullRequest
0 голосов
/ 25 апреля 2019
    i    j
    1    2
    1    3
    3    2
    4    5
    5    6
    7    8
    9    10
    .    .
    .    .
    .    .
    101  1
    102  105
    102  4

Каждая строка в приведенной выше таблице представляет человека.Столбцы i и j являются идентификаторами лица и принадлежат только этому человеку.Эти идентификаторы отображаются в нескольких строках, поэтому строка, содержащая один и тот же идентификатор другой строки, будет означать, что эти две строки представляют одного и того же человека, а также парные идентификаторы в этих строках принадлежат этому человеку.Например, строка 1 содержит 1 и 2, а строка 2 содержит 1 и 3. Поскольку 1 существует в обеих этих строках, это означает, что 1,2 и 3 являются идентификаторами этого человека.Человек может иметь любое количество рядов.

Я ищу эффективный алгоритм классификации, который сгруппирует все идентификаторы вместе и назначит уникальный идентификатор, представляющий человека, назначенного этим идентификаторам.Это тип проблемы классификации дискретной цепочки.Есть ли какой-нибудь алгоритм или классификационная практика, которую я должен изучить, чтобы помочь решить мою проблему.Я также работаю в Python и Pandas, если есть известная библиотека.

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

* Может быть, это вам поможет.

import pandas as pd

l1= ['i','j']
l2 = [[1,2],
      [1,3],
      [3,2],
      [4,5],
      [5,6],
      [7,8],
      [9,10],
      [101,1],
      [102,105],
      [102,4]]


df = pd.DataFrame(l2, columns=l1)

print(df)

df  = df.groupby('i')['j'].apply(list).reset_index(level='i')

print(df)

## ### Output  ####
#Before
     i    j
0    1    2
1    1    3
2    3    2
3    4    5
4    5    6
5    7    8
6    9   10
7  101    1
8  102  105
9  102    4

#After
     i         j
0    1    [2, 3]
1    3       [2]
2    4       [5]
3    5       [6]
4    7       [8]
5    9      [10]
6  101       [1]
7  102  [105, 4]
1 голос
/ 25 апреля 2019

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

import networkx as nx

data=[
    [1, 2],
    [1, 3],
    [3, 2],
    [4, 5],
    [5, 6],
    [7, 8],
    [9, 10]
]

G = nx.Graph()
G.add_edges_from(data)
list(nx.connected_components(G))

Возвращает:

[{1, 2, 3}, {4, 5, 6}, {7, 8}, {9, 10}]

Что вы хотите найтиназывается подключенных компонентов .

...