>  기사  >  백엔드 개발  >  Python의 KNN 알고리즘(k-최근접 이웃 알고리즘)에 대한 자세한 소개(예제 포함)

Python의 KNN 알고리즘(k-최근접 이웃 알고리즘)에 대한 자세한 소개(예제 포함)

不言
不言앞으로
2019-01-14 11:24:173496검색

이 기사는 Python의 KNN 알고리즘(k-nearest neighbor 알고리즘)에 대한 자세한 소개를 제공합니다. 이는 특정 참조 가치가 있으므로 도움이 될 수 있습니다.

KNN 알고리즘은 데이터 분류 알고리즘으로, 표본에서 나온 k개의 최근접 이웃 데이터의 범주가 표본의 범주를 나타내므로 k-최근접 이웃 알고리즘이라고도 합니다. KNN 알고리즘은 데이터 마이닝에서 가장 간단한 방법 중 하나이며 대략 다음 단계로 나눌 수 있습니다.

  • 훈련 데이터: 원본 데이터 세트에 있는 모든 데이터 범주의 데이터입니다.

  • 테스트 데이터: 테스트에 사용할 데이터 샘플입니다.

  • 데이터 처리

우리가 얻는 테스트 데이터는 일반적으로 훈련 데이터와 다른 차원입니다. 이때 테스트 데이터의 차원을 Python의 numpy가 제공하는 것과 동일하게 늘려야 합니다. 타일() 함수를 사용하면 테스트 데이터의 차원을 높이는 데 도움이 될 수 있습니다.

  • 데이터 벡터화

테스트 데이터의 차원이 증가한 후 샘플 지점으로부터의 거리를 계산하려면 이때 데이터를 벡터화해야 합니다. 소위 벡터화는 매우 간단합니다. 즉, 동일한 차원을 가진 두 개의 데이터를 뺍니다.

  • 유클리드 거리 계산

유클리드 거리, 즉 유클리드 거리는 피타고라스 정리를 이용하여 계산할 수 있으며, 상승된 테스트 데이터와 훈련 데이터를 뺀 벡터군의 각 벡터는 제곱근과 제곱근입니다. of 는 거리로 구성된 벡터 그룹을 얻는 데 사용될 수 있습니다.

  • 거리에 따라 분류

샘플 포인트로부터 거리가 가장 짧은 k 데이터를 선택하고, 이 k 데이터 중 어떤 데이터 카테고리가 가장 많이 나타나는지 세어 보면 샘플 포인트의 데이터 카테고리를 결정할 수 있습니다.

알고리즘 구현:

1 먼저 numpy와 연산자를 도입해야 합니다. from numpy import *import 연산자를 입력하세요. from numpy import *import operator

2.接下来我们需要定义一个knn函数,在knn函数中我们需要引入四个参数,分别为k、训练数据、测试数据和数据类别。

3.接下来我们需要先对数据进行升维操作,需要用到numpy下的tile(a,(b,c))函数,a为要进行升维操作的数据,也就是测试数据,b为要对测试数据升维的行数据,c为要对测试数据升维的列数据。

Python의 KNN 알고리즘(k-최근접 이웃 알고리즘)에 대한 자세한 소개(예제 포함)

4.在上一操作中,我们一般需要获得训练数据的行数和列数,这时需要用到shape()函数,shape()函数返回的是由训练数据的行和列组成的元组,我们想要知道训练数据的行数或列数只需通过数组元素下标的方式引用。

Python의 KNN 알고리즘(k-최근접 이웃 알고리즘)에 대한 자세한 소개(예제 포함)

5.数据的维度相同后,我们要将两数据相减得到一个向量,再计算这个向量每个值的平方和的开方即得测试数据到训练数据的距离,再调用argsort()函数将距离按照升序排列,不过该函数返回的是数组元素的下标。

Python의 KNN 알고리즘(k-최근접 이웃 알고리즘)에 대한 자세한 소개(예제 포함)

6.接下来我们为了直观的看到不同数据类别的出现次数,需要设置一个空字典来存放这些数据,在得到字典后,我们需要将字典按照不同数据类别的出现次数降序排列,进而返回字典的第一个值即得到测试数据的数据类别。

7.算法代码如下:

from numpy import *
import operator
def knn(k, test_data, train_data, labels):
    train_size = train_data.shape[0]    #获取训练数据的行数
    test_size = tile(test_data, (train_size, 1))    #将测试数据的行升维
    minus = test_size-train_data    #得到向量
    sq_minus = minus**2
    sum_sq_minus = sq_minus.sum(axis=1)        #得到平方后的每个数组内元素的和
    distc = sum_sq_minus**0.5
    sort_distc = distc.argsort()    #将距离按升序排列
    static = {}
    for i in range(0, k):
        vote = labels[sort_distc[i]]    #获取数据类型
        static[vote] = static.get(vote, 0)+1    #统计每个数据类型的出现次数
    sort_static = sorted(static.items(), key=operator.itemgetter(1), reverse=True)    #将字典中的元素按出现次数降序排列
    return sort_static[0][0]    #返回出现次数最多的数据类型

8.算法中需要对字典进行排序,因此需要用到sorted()函数,sorted()函数共有三个参数,分别为items(),operator.itemgetter(),reverse,默认的排序为升序,我们要想按照降序排列需要令第三个参数为True,在这里我们是按照字典的values进行排序的,因此我们需要输入sorted(static.items(), key=operator.itemgetter(1), reverse=True)

2. 다음으로 knn 함수를 정의해야 합니다. knn 함수에는 k, 훈련 데이터, 테스트 데이터 및 데이터 카테고리라는 네 가지 매개변수를 도입해야 합니다.

3. 다음으로 먼저 데이터에 대한 차원 향상 작업을 수행해야 합니다. numpy에서 타일(a,(b,c)) 함수를 사용해야 합니다. , b는 테스트 데이터로 업그레이드할 행 데이터이고, c는 테스트 데이터로 업그레이드할 열 데이터이다. Python의 KNN 알고리즘(k-최근접 이웃 알고리즘)에 대한 자세한 소개(예제 포함)

4 이전 작업에서는 일반적으로 훈련 데이터의 행과 열 수를 가져와야 합니다. 이 경우 Shape() 함수는 행과 열을 반환합니다. 학습 데이터의 열 튜플, 학습 데이터의 행 또는 열 수를 알고 싶다면 배열 요소의 첨자를 통해서만 참조하면 됩니다. Python의 KNN 알고리즘(k-최근접 이웃 알고리즘)에 대한 자세한 소개(예제 포함)

5 데이터의 크기가 동일해지면 두 데이터를 빼서 벡터를 얻은 다음 이 벡터의 각 값의 제곱합의 제곱근을 계산하여 거리를 구해야 합니다. 테스트 데이터를 훈련 데이터로 변환한 다음 argsort() 함수를 호출하면 거리가 오름차순으로 정렬되지만 함수는 배열 요소의 첨자를 반환합니다. 🎜🎜🎜🎜🎜🎜6. 다음으로, 다양한 데이터 카테고리의 발생 횟수를 직관적으로 확인하기 위해서는 데이터를 저장할 빈 사전을 설정해야 합니다. 사전을 가져온 후에는 사전을 내림차순으로 정렬해야 합니다. 그런 다음 사전의 첫 번째 값을 반환하여 테스트 데이터의 데이터 카테고리를 가져옵니다. 🎜🎜7. 알고리즘 코드는 다음과 같습니다. 🎜rrreee🎜8. 사전은 알고리즘에서 정렬해야 하므로 sorted() 함수에는 items()라는 세 가지 매개변수가 있습니다. , Operator.itemgetter() , 반대로 기본 정렬은 오름차순입니다. 내림차순으로 정렬하려면 세 번째 매개변수를 True로 설정해야 합니다. 여기서는 사전의 값에 따라 정렬합니다. 이므로 sorted(static.items() , key=operator.itemgetter(1), reverse=True)를 입력해야 합니다. Operator.itemgetter() 함수의 값이 1이면 는 사전의 값에 따라 정렬되며, 값이 0인 경우 정렬할 사전의 키에 따라 정렬됩니다. 🎜🎜🎜🎜🎜🎜🎜9. 정렬 후 요소에 액세스하는 방법은 2차원 배열 요소에 액세스하는 방법과 동일합니다🎜🎜🎜🎜🎜🎜🎜🎜

위 내용은 Python의 KNN 알고리즘(k-최근접 이웃 알고리즘)에 대한 자세한 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제