2 개의 벡터가 있다고 가정합니다. 알고리즘을 비교하기 위해 어떤 알고리즘을 사용할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1805987

  •  05-07-2019
  •  | 
  •  

문제

회사 1에는이 벡터가 있습니다.

['books','video','photography','food','toothpaste','burgers'] ... ...

회사 2에는이 벡터가 있습니다.

['video','processor','photography','LCD','power supply', 'books'] ... ...

이것이 주파수 분포라고 가정 해 봅시다 (튜플로 만들 수 있지만 너무 많은 타입).
보시다시피 ...이 벡터에는 겹치는 것들이 있습니다. "비디오"와 "사진"은 비슷한 위치에 있다는 사실 때문에 두 벡터 사이에서 "유사한"것으로 보인다. 그리고 ... "책"은 분명히 회사 1의 강력한 포인트입니다. 주문 및 포지셔닝은 주파수 분포이기 때문에 중요합니다.

이것을 가지고 놀기 위해 어떤 알고리즘을 사용할 수 있습니까? 이러한 벡터를 사용하여 이러한 회사에 귀중한 데이터를 제공 할 수있는 어떤 알고리즘을 사용할 수 있습니까?

나는 텍스트 마이닝과 정보를 처음 사용합니다. 누군가이 질문과 관련하여 그 주제에 대해 저를 안내 할 수 있습니까?

도움이 되었습니까?

해결책

위치는 매우 중요합니다. 강조하는 것처럼 중요한 지표는 다른 벡터의 동일한 항목 사이의 위치 차이 (예를 들어, 차이의 절대 값 또는 사각형)를 기반으로합니다. 해결해야 할 가장 큰 문제는 한 벡터에 존재하는 아이템의 무게 (N-th-thane)의 무게를 측정하고 다른 벡터에는 완전히 결석해야합니다. 예를 들어 실제 품목이 실제 항목 바로 뒤에있는 것처럼 비교적 사소한 문제입니까? 실제 응용 프로그램 영역에 대한 이해없이 말하기는 불가능합니다. 이 문제를 다루는 다양한 방법을 시도하고 신경 쓰는 경우 예를 들어 어떤 결과를 제공하는지 확인할 수 있습니다!

예를 들어, "누락 된 항목이 실제 항목 바로 뒤에있는 것과 거의 동일하다"고 가정 해 봅시다. 그런 다음 각 입력 벡터를 DICT 매핑 항목으로 전처리하여 위치에 위치 할 수 있습니다 (많은 입력 벡터 쌍을 비교 해야하는 경우 중요한 최적화!) : :

def makedict(avector):
  return dict((item, i) for i, item in enumerate(avector))

그런 다음 그러한 두 가지 dicts를 비교합니다.

def comparedicts(d1, d2):
  allitems = set(d1) | set(d2)      
  distances = [d1.get(x, len(d1)) - d2.get(x, len(d2)) for x in allitems]
  return sum(d * d for d in distances)

(또는 마지막 진술에서 제곱 대신 ABS (d). 누락 된 항목의 무게를 높이려면 (접근, 즉 벡터를 만들고, 더 멀리 고려하십시오), 유사하게 구조화 된 프로그램에서 길이 대신, 또는 100과 같은 큰 상수 대신 두 배의 길이를 사용할 수 있습니다.

다른 팁

나는 당신에게 불리는 책을 제안합니다 집단 지능 프로그래밍.
이와 같은 간단한 데이터에서 정보를 검색 할 수있는 방법에 대한 아주 좋은 책입니다. 코드 예제가 포함되어 있습니다 (파이썬에서 :)

편집하다:GBJBAANB에 답장 : 이것은 파이썬입니다!

a = ['books','video','photography','food','toothpaste','burgers']
b = ['video','processor','photography','LCD','power supply', 'books']
a = set(a)
b = set(b)

a.intersection(b)
    set(['photography', 'books', 'video'])

b.intersection(a)
    set(['photography', 'books', 'video'])

b.difference(a)
    set(['LCD', 'power supply', 'processor'])

a.difference(b)
    set(['food', 'toothpaste', 'burgers'])

보세요 해밍 거리

MBG가 언급했듯이, 해밍 거리는 좋은 출발입니다. 기본적으로 회사 가치에 포함되어 있는지 여부에 관계없이 가능한 모든 항목에 대해 비트 마스크를 할당합니다.

예를 들어. 치약은 회사 A의 경우 1이지만 회사 B의 경우 0입니다. 그런 다음 회사마다 다른 비트를 계산합니다. 자카 카드 계수는 이와 관련이 있습니다.

해밍 거리는 실제로 "비디오"와 "사진"과 같은 것들 사이의 유사성을 포착 할 수 없습니다. 분명히, 하나를 판매하는 회사는 치약을 판매하는 회사보다 더 높은 확률로 다른 회사를 판매합니다.

이를 위해 LSI (차원 감소에도 사용됨) 또는 요인 코드 (예 : 제한된 Boltzman 기계, 자동 에코 코더 또는 예측 최소화)와 같은 물건을 사용하여 더 컴팩트 한 표현을 얻을 수 있으므로 유클리드 거리를 사용하여 비교할 수 있습니다.

각 항목의 순위를 선택하고 (높은 순위가 더 좋습니다) 일치 사이의 기하학적 수단을 만듭니다.

두 벡터의 경우

sum(sqrt(vector_multiply(x,y)))  //multiply matches

벡터에 대한 각 값에 대한 순위의 합은 각 벡터에 대해 동일해야합니다 (선호 1). 따라서 2 개 이상의 벡터를 비교할 수 있습니다.

ikkebr의 metod를 적용하면 A가 어떻게 B에 끓는 지 찾을 수 있습니다.

이 경우 사용됩니다

sum( b( b.intersection(a) ))

당신은 사용할 수 있습니다 set_intersection 연산. 2 개의 벡터는 먼저 정렬 된 다음 (정렬 호출 사용) 4 개의 반복자를 통과시켜야하며 공통 요소에 삽입 된 컬렉션을 다시 얻을 수 있습니다. 비슷하게 작동하는 다른 사람들이 몇 명 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top