올바른 지점을 선택하기 위해 적용 할 알고리즘


9

아래 그림은 원점 주위의 7 점을 보여줍니다. 그 중 하나는 규칙과 경험에 따라 인간에 의해 선택되었으며 빨간색 (왼쪽 아래 사분면에있는 것)으로 표시됩니다.

여기에 이미지 설명을 입력하십시오

이제 우리는이 포인트 세트 중 1000 개가 넘고 각 세트마다 인간이 단일 포인트를 선택했습니다. 이 조건은 모든 세트에 적용됩니다.

  • 각 세트는 약 3-10 포인트
  • 특이 치가 없습니다
  • 점은 양수 및 음수 값을 가질 수 있습니다
  • 포인트를 선택할 때 실수가 없었습니다

내 질문은 :이 세트와 인간이 만든 선택에서 배울 수있는 기계 학습 알고리즘이 있습니까? 그래서 새로운 포인트 세트가 주어지면 선택할 포인트를 자동으로 결정할 수 있습니까? 이 새로운 세트는 물론 위의 처음 3 가지 조건을 충족합니다.

최종 비고 :

  • 내가 준 예제는 선택한 원점과 함께 원점 주위 평면의 점에 대한 아이디어를 지원하기 위해 무작위로 구성된 예입니다. 실제로는 더 많은 구조가있을 수 있지만 지금은 궁금 하고이 경우 가능한 것이 무엇인지 알고 싶습니다.
  • 변형이 가능할까요? 선택한 점이 약 2 점이거나 점 대신 지정된 반지름을 가진 원이 있다고 가정하십시오.

2
크게 생각하면, 커널 트릭이 도움이 될까요? 선택된 점은 다른 공간에서 분리 될 가능성이있는 반면 다른 점과 매우 가깝게 보이는 것처럼 보입니다 (예 : 더 높은 차원). 나는 그것이 가치가 있다고 말할 것입니다.
TwinPenguins

1
@MajidMortazavi 좋은 소리. 솔직히 말해서 머신 러닝은 새로운 분야입니다. 내가 아는 유일한 것은 많은 가능성이 있지만 방법과 방법에 대한 실마리는 없습니다. 커널 제안에 대해 읽으십시오.
Elmex80s

2
다른 지점으로부터의 거리, 다른 지점의 수 등과 같은 각 지점에 기능을 추가하는 경우 K-Nearest Neighbors와 같은 간단한 것을 사용하여 훈련 한 역사적인 지점을 결정할 수 있습니다. 새 요점을 파악하고 해당 분류를 사용하십시오. 이러한 종류의 비선형 경계에는 의사 결정 트리 또는 신경망이 더 적합 할 수 있습니다.
Dan Carter

1
@ DanCarter의 의견을 피기 백하는 데 사용할 ML 알고리즘을 묻는 것은 잘못된 질문입니다. 엔지니어링 할 수있는 기능을 생각하고 사용할 방법을 결정하도록하십시오 (여기에서 복수가 중요합니다. 문제가 잘 이해되지 않는 한 한 가지 방법 만 시도하면 안됩니다). 시도 할 수있는 몇 가지 다른 기능 : 중심으로부터의 거리 (절대 및 평균 점 중심 거리에 상대적인 거리), 원점으로부터의 거리, 원점 간 벡터가 축과 이루는 각도.
Paul

1
두 개 이상의 지점이 임의로 서로 가까이있을 수 있습니까?
Imran

답변:


6

이것은 매혹적인 문제입니다! 두 가지로 인해 특히 어려움이 있습니다.

  • 두 점 세트를 어떻게 비교해야합니까? 기계 학습에서 고전 문제는 속성의 고정 된 수 있고, 이러한 특성은 서로 호환되지 않습니다 : 예를 들어, 내가 속성과 다른 사람에 대한 데이터를 가질 수 ageheight(센티미터)을. 모든 샘플에는 각각 하나의 항목이 있으며 물론 (age, height) = (22, 180)동일하지 않습니다 (age, height) = (180, 22). 당신의 문제에서도 마찬가지입니다. 포인트 세트는 3-10 포인트 사이이며, 포인트를 입력하는 순서는 두 포인트 세트를 비교할 때 차이가 없어야합니다.
  • 우리는 어떻게 예측합니까? 위의 포인트 세트와 유사한 트레이닝 세트에서 포인트 세트를 선택하는 방법을 찾았다 고 가정 해보십시오. 우리는 우리의 예측이 당신의 그림에서 7 점 중 하나 여야한다는 문제에 직면 해 있습니다. 그러나 이러한 점 중 어느 것도 유사한 점 세트에 포함되어 있지 않을 수 있습니다.

두 가지 과제를 모두 다루는 알고리즘을 간략하게 설명하겠습니다. 예측 정확도는 그리 좋지 않습니다. 어쩌면 당신은 그것을 향상시킬 수있는 방법을 볼 수 있습니다. 그리고 적어도 그것은 무언가를 예측 합니다 .

1. 샘플 시뮬레이션

알고리즘을 테스트 할 수 있도록 샘플과 레이블을 생성하는 함수를 작성했습니다.

샘플 생성 : 각 샘플에는 3 ~ 10 개의 점이 있습니다. 균일 한 분포에서 도출 된 점의 수는 임의적입니다. 각 포인트는 형식 (x_coordinate, y_coordinate)입니다. 좌표는 다시 정규 분포에서 도출 된 임의입니다.

import numpy as np
from random import randint

def create_samples(number_samples, min_points, max_points):

    def create_single_sample(min_points, max_points):
        n = randint(min_points, max_points)
        return np.array([np.random.normal(size=2) for _ in range(n)]) 

    return np.array([create_single_sample(min_points, max_points) for _ in range(number_samples)])

레이블 생성 : 장난감의 예로, 점을 선택하는 규칙은 다음과 같다고 가정 해 봅시다. 항상 가장 가까운 점을 선택하십시오 (0, 0). 여기서 가장 가까운 점은 유클리드 규범의 관점에서 이해해야합니다.

def decision_function_minnorm(sample):
    norms = np.apply_along_axis(np.linalg.norm, axis=1, arr=sample)
    return sample[norms.argmin()]

def create_labels(samples, decision_function):
    return np.array([decision_function(sample) for sample in samples])

이제 기차 및 테스트 세트를 만들 수 있습니다.

n_train, n_test = 1000, 100
dec_fun = decision_function_minnorm

X_train = create_samples(number_samples=n_train, min_points=3, max_points=10)
X_test = create_samples(number_samples=n_test, min_points=3, max_points=10)
y_train = create_labels(X_train, dec_fun)
y_test = create_labels(X_test, dec_fun)

2. Hausdorff 거리를 통한 포인트 세트 비교

첫 번째 문제를 해결해 봅시다 : 어떻게 다른 포인트 세트를 비교해야합니까? 포인트 세트의 포인트 수가 다릅니다. 포인트를 기록하는 순서는 중요하지 않습니다. 포인트 세트 [(0,0), (1,1), (2,2)]와 비교하면 포인트 세트와 비교할 때와 동일한 결과가 나타납니다 [(2,2), (0,0), (1,1)]. 내 접근 방식은 Hausdorff 거리 를 통해 점 세트를 비교하는 것입니다 .

def hausdorff(A, B):

    def dist_point_to_set(x, A):
        return min(np.linalg.norm(x - a) for a in A)

    def dist_set_to_set(A, B):
        return max(dist_point_set(a, B) for a in A)

    return max(dist_set_to_set(A, B), dist_set_to_set(B, A))

3. k- 최근 접 이웃을 통한 예측 및 평균화

이제 포인트 세트 사이의 거리에 대한 개념이 있습니다. 이를 통해 k- 최근 접 이웃 분류를 사용할 수 있습니다. 테스트 포인트 세트가 주어지면 k훈련 샘플에서 테스트 포인트 세트에 비해 Hausdorff 거리가 가장 작은 포인트 세트를 찾아 레이블을 얻습니다. 이제 두 번째 문제가 온다 :이 k레이블을 어떻게 테스트 포인트 세트에 대한 예측으로 바꾸는가? 가장 간단한 방법을 사용했습니다. 레이블을 평균하고 테스트 포인트 집합에서 평균에 가장 가까운 지점을 예측합니다.

def predict(x, num_neighbors):
    # Find num_neighbors closest points in X_train.
    distances_to_train = np.array([hausdorff(x, x_train) for x_train in X_train])
    neighbors_idx = np.argpartition(distances_to_train, -num_neighbors)[-num_neighbors:]

    # Get labels of the neighbors and calculate the average.
    targets_neighbors = y_train[neighbors_idx]
    targets_mean = sum(targets_neighbors) / num_neighbors

    # Find point in x that is closest to targets_mean and use it as prediction.
    distances_to_mean = np.array([np.linalg.norm(p - targets_mean) for p in x])
    closest_point = x[distances_to_mean.argmin()]

    return closest_point

4. 테스트

알고리즘의 성능을 테스트하기위한 모든 것이 갖추어져 있습니다.

num_neighbors = 70
successes = 0
for i, x in enumerate(X_test):
    print('%d/%d' % (i+1, n_test))
    prediction = predict(x, num_neighbors)
    successes += np.array_equal(prediction, y_test[i])

주어진 의사 결정 함수 및 num_neighbors = 70에 대해 예측 정확도는 84 %입니다. 이것은 끔찍한 것이 아니며, 물론 우리의 결정 기능에 따라 다르며 예측하기가 쉽습니다.

이를 확인하려면 다른 의사 결정 기능을 정의하십시오.

decision_function_maxaverage(sample):
    avgs = (sample[:, 0] + sample[:, 1]) / 2
    return sample[norms.argmin()]

이 기능을 통해 dec_fun = decision_function_maxaverage예측 정확도를 45 %로 낮 춥니 다. 레이블을 생성하는 결정 규칙에 대해 생각하는 것이 얼마나 중요한지를 보여줍니다. 사람들이 특정 포인트를 선택하는 이유를 알고 있다면 이것이 최상의 알고리즘을 찾는 데 도움이됩니다.

이 알고리즘을 개선하는 몇 가지 방법 : (1) Hausdorff 거리 대신 다른 거리 함수를 사용하십시오. (2) k- 최근 접 이웃보다 더 정교한 것을 사용하십시오. (3) 선택한 교육 레이블이 예측으로 바뀌는 방법을 개선하십시오.


3

신경망을 사용하여이 문제를 해결할 수있는 몇 가지 방법은 다음과 같습니다.

일반 피드 포워드 신경망을 사용하는 경우 :

  • (-1, -1)에서 (1,1)까지 원점 주위의 정사각형에 맞게 데이터 크기를 조정합니다
  • x 및 y 좌표에 해당하는 두 개의 입력 또는 번째 점이없는 경우 0,0으로 각 점을 나타냅니다.k
  • 각 포인트에 세 번째 표시기 입력을 추가하여 해당 포인트가 있는지 여부를 나타냅니다.
  • 숨겨진 레이어의 수와 크기를 선택하십시오
  • 출력에서 크기가 10 인 softmax 레이어를 사용하십시오.

따라서 모든 입력 예제는 길이가 30 인 벡터입니다. 여기서 집합에 포인트가 있으면 마지막 3 * (10- ) 값이 0이되고 출력은 1에 합산되는 길이 10의 벡터입니다. 최대 값은 예측 지점에 해당합니다 (이 위치는 입력의 해당 위치에 해당).kk

컨볼 루션 뉴럴 네트워크 :

  • 격자 평면으로 나눈다 X 사각형과 같이 입력을 나타내는 X 인 행렬 이있는 경우 정사각형 (점에서 ) 및 , 그렇지. 점이 겹치지 않기 때문에 초와 초의 행렬이 있습니다.nnnnkki,j010
  • 입력 행렬에서 CNN을 훈련시킵니다. 출력 모양은 크기의 소프트 맥스 여야하며 이는 평평한 입력 모양에 해당합니다. 해당 출력 좌표에서 가장 높은 값을 가진 점을 선택하십시오.nn

데이터는 본질적으로 공간적이므로 CNN의 성능이 향상 될 수 있습니다. 그러나 둘 이상의 포인트가 겹치는 경우 수행 할 작업을 결정해야합니다. 가장 간단한 해결책은 하나를 임의로 선택하는 것입니다. 특정 작업에 따라 괜찮을 수도 있습니다.

반복적 인 신경망으로 :

  • 스케일링 된 (x, y) 포인트의 가변 길이 시퀀스를 피드하고 크기 10 softmax 추정값을 출력합니다

예, RNN과 마찬가지로 쉽습니다! 가변 길이 입력을 잘 처리하지만 공간 데이터를 처리하기위한 CNN의 장점은 여전히 ​​부족합니다.

주의 사항 :

FNN 또는 RNN을 사용하는 경우 입력 데이터를 주문하는 방법도 중요합니다. 실제 데이터에 고유 한 순서가 없으면 네트워크가 동일한 순서로 인코딩 된 동일한 데이터에 대해 다른 예측을하는 것을 원하지 않습니다. 이를 처리하는 한 가지 방법은 데이터 확대 (data augmentation)입니다 . 각 교육 예제를 다른 입력 순서로 여러 번 복제하므로 네트워크에서 적절한 대칭을 학습 할 수 있기를 바랍니다.

하나의 접근 방식 만 시도 할 시간이 있다면 CNN을 선택합니다. CNN은 공간 데이터와 잘 맞도록 설계되었으며 입력 순서에는 문제가 없습니다.


1
이것의 문제점은 예측이 순서에 의존한다는 것이다. 알고리즘에 포인트 세트 (0,0), (1,1), (2,2)를 공급하면 포인트 세트를 공급하는 것과 다른 효과가 (1,1), (2,2), (0,0)있습니다.
Elias Strehle

좋은 지적 Elias-나는 그것을 완화시키기위한 제안을 할 것입니다.
Imran

@EliasStrehle이 언급 했으므로 순서는이 문제와 관련이 없습니다. 우리는 일련의 포인트를 가지고 있습니다.
Elmex80s
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.