K 근린 법(KNN)에 관 한 지식 총화 및 python 으로 어떻게 실현 하 는 지
K 근린 법(K-nearest neighbors,KNN)은 분류 도 가능 하고 회귀 도 가능 하 다.
KNN 이 회귀 와 분 류 를 하 는 차 이 는 최종 예측 시의 의사 결정 방식 에 있다.
KNN 은 분류 할 때 보통 다수결 법 을 사용한다
KNN 이 컴백 할 때 는 보통 평균 법 을 사용한다.
기본 개념 은 다음 과 같다.테스트 인 스 턴 스 에 대해 훈련 데이터 에서 이 인 스 턴 스 와 가장 가 까 운 K 개의 인 스 턴 스(즉,위 에서 말 한 K 개의 이웃)를 집중 적 으로 찾 으 면 이 K 개의 인 스 턴 스 는 대부분 특정한 유형 에 속 하 므 로 이 입력 인 스 턴 스 를 이 유형 으로 분류 한다.
2.KNN 알고리즘 3 요소
KNN 알고리즘 은 주로 k 값 의 선택,거리 측정 방식,분류 결정 규칙 을 고려한다.
1)k 값 의 선택.응용 에서 k 값 은 일반적으로 비교적 작은 값 을 선택 하고 보통 교차 검증 을 사용 하여 가장 좋 은 k 값 을 취한 다.
K 수치 가 비교적 작고 훈련 오차 가 줄 어 들 며 일반화 오차 가 커지 면 모델 이 복잡 하고 의합 하기 쉽다.
K 수치 가 비교적 크 고 일반화 오차 가 줄 어 들 며 훈련 오차 가 커진다.모델 은 간단하게 예측 에 오류 가 발생 한다(하나의 극단,K 는 견본 수 m 와 같 으 면 분류 가 전혀 없다.이때 테스트 집합 이 무엇 이 든 결 과 는 훈련 집중 이 가장 많은 유형 에 속한다).
2)거리 측정.Lp 거리:오차 절대 치 p 차방 구 와 재 구 p 차 근.유럽식 거리:p=2 의 Lp 거리.맨 해 튼 거리:p=1 의 Lp 거리.p 가 무한대 일 때,Lp 거 리 는 각 차원 에서 거리의 최대 값 이다.
3)분류 결정 규칙.K 개 최근 이웃 에 따라 테스트 대상 의 분 류 를 결정 하 는 방법 이다.k 최근 이웃 의 분류 결정 규칙 은 일반적으로 다수 표결 을 선택한다.
3.KNN 기본 실행 절차
1)측정 대상 과 훈련 이 각 견본 점 에 집 중 된 유럽식 거 리 를 계산한다.
2)위의 모든 거리 값 정렬
3)"유권자"로 k 개의 최소 거리의 견본 을 선정한다
4)'유권자'에 따라 측정 대상 견본 의 분류 또는 가 치 를 예측한다
4.KNN 특징
1)원리 가 간단 하 다
2)모델 을 저장 하려 면 모든 견본 집 을 저장 해 야 한다.
3)훈련 과정 이 빠 르 고 예측 속도 가 느리다
・장점:
정밀도 가 높 고 이상 치 에 민감 하지 않다.
수치 형 데이터 와 이산 형 데이터 에 사용 할 수 있다.
단점:
시간 복잡성 이 높다.공간 복잡성 이 높다.많은 메모리 가 필요 합 니 다.
견본 의 불 균형 문제(즉,일부 유형의 견본 수량 이 많 고 다른 견본 의 수량 이 적다).
보통 수치 가 많 을 때 는 이것 을 쓰 지 않 고 계 산 량 이 너무 많다.그러나 하나의 견본 이 너무 적어 서 는 안 된다.그렇지 않 으 면 오점 이 발생 하기 쉽다.
가장 큰 단점 은 데이터 의 내 적 의 미 를 제시 할 수 없다 는 것 이다.
생각해 야 할 문제:
견본 속성 은 어떻게 선택 합 니까?어떻게 두 대상 간 의 거 리 를 계산 합 니까?견본 의 각 속성의 유형 과 척도 가 같 지 않 으 면 어떻게 처리 합 니까?각 속성 이 다른 중요 도 는 어떻게 처리 합 니까?모델 의 좋 고 나 쁨 은 어떻게 평가 합 니까?
5.코드 구현
K 근린 알고리즘 의 일반적인 절차:준비 데이터-분석 데이터-테스트 알고리즘-사용 알고리즘
5.1 sklearn 패키지 구현
sklearn 에 대한 상세 한 소 개 는 이전 블 로 그 를 보십시오. //www.jb51.net/article/204984.htm
5.1.1 sklearn 실현 k-근린 알고리즘 안내 공식 문서
5.1.2 KNeighbors Classifier 함수 8 개 인자
5.1.3 실례
(1)영화 분류
import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
#
df = pd.read_excel(../../myfile.excel)
#1、
knn = KNeighborsClassifier(n_neighbors=3)
#2、 : ,
feature = df[['Action Lean','Love Lean']]
target = feature['target']
#3、
knn.fit(feature,target)
#4、
movie = np.array([13,21])
res = knn.predict(movie) #5、 : knn.score(feature,target)
(2)연간 수입 이 50K 달러 이상 인지 예측
# adult.txt , , KNN , 50
# 1.
data = pd.read_csv('../data/adults.txt')
data.head()
# 2. 、 、 、
feature = data[['age','education_num','occupation'
,'hours_per_week']]
target = data['salary']
# 3. knn ,
# , String int
#### map ,
dic = {}# unique()
occ_arr = feature['occupation'].unique()
#
for i in range(occ_arr.size):
dic[occ_arr[i]] = i
#
feature['occupation'] = feature['occupation'].map(dic)
# 4. :
# ( )
feature.shape
#
x_train = feature[:32500]
y_train = target[:32500]
#
x_test = feature[32500:]
y_test = target[32500:]
# 5.
from sklearn.neighbors import KNeighborsClassifier
# knn ,
# :n_neighbors , .
knn = KNeighborsClassifier(n_neighbors=10)
# fit() , ( , )
knn.fit(x_train,y_train)
# ( , )
knn.score(x_test,y_test)
# 6.
print(' :',np.array(y_test))
print(' :',knn.predict(x_test))
(3)실례:sklearn 기반 핸드폰 디지털 식별 시스템 실현pylot 그림 읽 기:imgarr.shape 모양 보기
import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
# 1、 : numpy :0,1,2,3,4,5,6,7,8,9
feature =[]
target =[]
for i in range(10):#0-9
for j in range(1,501): #1-500
imgpath = './data/'+str(i)+'/'+str(i)+'_'+str(j)+'.bmp' #
img_arr = pld.imread(imgpath)
feature.append(img_arr)
target.append(i)
# 2、 numpy ;feature ;
feature = np.array(feature) # feature ,
target = np.array(target)
feature.shape
(5000,28,28) # 5000 28*28
# :feature ; , !
# 3、feature
feature.shape(5000,784)
#4、
np.random.seed(10)
np.random.shuffle(feature)
np.random.seed(10)
np.random.shuffle(target)
# 5、 :
x_train = feature[:4950]
y_train = target[:4950]
x_test = feature[4950:]
y_test = target[4950:]
# 6、 : :n_neighbors , .
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=8)
knn.fit(x_train,y_train) # ( , )
# 7、 ( , )
knn.score(x_test,y_test)
# 8、
print(' ',y_test)
print(' ',knn.predict(x_test))
#9、
from sklearn.externals import joblib
joblib.dump(knn,'./knn.m')
#10、
knn = joblib.load('./knn.m')
#-------------------------------------------------------------------------------------------------
# 11、
# :
# !!! !!!
img_arr = plt.imgread('./ .jpg')
eight_arr = img_arr[170:260,80:70] #
plt.imshow(eight_arr) #
# :feature.shape(5000,784) 784 ;
# 12、 eight_arr ( ): (65,50,3) (28,28)
eight_arr.mean(axis=2 ) # axis=2 , (65,50) !
# 13、
import scipy.ndimage as ndimage
data_pre_test = ndimage.zoom(eight_arr,zoom=(28/65,28/50))
eight_arr.shape #(28,28)
# 14、 (28,28) (1,784)
eight_arr = eight_arr(1,784)
# 15、
knn.predict(eight_arr)
array([8])
# -*- coding: UTF-8 -*-
import numpy as np
import operator
from os import listdir
from sklearn.neighbors import KNeighborsClassifier as kNN
"""
: 32x32 1x1024 。
Parameters:
filename -
Returns:
returnVect - 1x1024
"""
def img2vector(filename):
# 1x1024
returnVect = np.zeros((1, 1024))
#
fr = open(filename)
#
for i in range(32):
#
lineStr = fr.readline()
# 32 returnVect
for j in range(32):
returnVect[0, 32*i+j] = int(lineStr[j])
# 1x1024
return returnVect
"""
:
Parameters:
Returns:
"""
def handwritingClassTest():
# Labels
hwLabels = []
# trainingDigits
trainingFileList = listdir('trainingDigits')
#
m = len(trainingFileList)
# Mat ,
trainingMat = np.zeros((m, 1024))
#
for i in range(m):
#
fileNameStr = trainingFileList[i]
#
classNumber = int(fileNameStr.split('_')[0])
# hwLabels
hwLabels.append(classNumber)
# 1x1024 trainingMat
trainingMat[i,:] = img2vector('trainingDigits/%s' % (fileNameStr))
# kNN
neigh = kNN(n_neighbors = 3, algorithm = 'auto')
# , trainingMat ,hwLabels
neigh.fit(trainingMat, hwLabels)
# testDigits
testFileList = listdir('testDigits')
#
errorCount = 0.0
#
mTest = len(testFileList)
#
for i in range(mTest):
#
fileNameStr = testFileList[i]
#
classNumber = int(fileNameStr.split('_')[0])
# 1x1024 ,
vectorUnderTest = img2vector('testDigits/%s' % (fileNameStr))
#
# classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
classifierResult = neigh.predict(vectorUnderTest)
print(" %d\t %d" % (classifierResult, classNumber))
if(classifierResult != classNumber):
errorCount += 1.0
print(" %d
%f%%" % (errorCount, errorCount/mTest * 100))
"""
:main
Parameters:
Returns:
"""
if __name__ == '__main__':
handwritingClassTest()
이 매개 변수의 설정 을 변경 하여 함수 에 대한 이 해 를 강화 할 수 있 습 니 다.이상 은 K 근린 법(KNN)에 관 한 지식 총화 와 python 으로 어떻게 실현 하 는 지 에 대한 상세 한 내용 입 니 다.python 이 K 근린 법(KNN)을 실현 하 는 지 에 관 한 자 료 는 저희 의 다른 관련 글 에 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
K-NN training이번에는 더 간편하게 scikit-learn을 사용해서 훈련 세트와 테스트 세트를 만들어보자. train_test_split() 함수를 사용하면 전달되는 리스트나 배열을 비율에 맞게 훈련 세트와 테스트 세트로 나누어...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.