K - NN (K - Nearest Neighbor) 알고리즘 의 Matlab 구현
최근 안면 인식 졸업 디자인 을 하 는데 퍼 지 KNN 알고리즘 (FuzzyKNN, FKNN) 을 사용 하고 있다.FKNN 은 KNN 을 바탕 으로 발 전 된 것 으로 인터넷 검색 블 로 그 는 이 알고리즘 에 대한 자료 가 부족 하고 시간 이 있 으 면 이 알고리즘 에 대한 상세 한 소 개 를 한 편 쓴다.이 편 은 Matlab 를 사용 하여 KNN (Kd - Tree 알고리즘 미 실현) 을 간단하게 실현 하 는데 주로 과학 연 구 를 대상 으로 한다.
코드 구현
function y = knn(x, x_train, y_train, K)
% KNN K-Nearest Neighbors Algorithm
% Input: x:
% x_train:
% y_train:
% K: K
%
% Output: y:
%
% Author: Keyven_guo
[size_x,~] = size(x); % ,
predicted_label = zeros(size_x,1); % Matrix[size_x][1] 0
for i = 1:size_x
[dist,neighbors] = top_K_neighbors(x_train,x(i,:),K);
% x(i,:) x i ,:
predicted_label(i) = keyclass(y_train(neighbors),max(y_train(neighbors));
% y_train(neighbors) ∈neighbors y_train
end
y = predicted_label;
end
function [dist, neighbors] = top_K_neighbors(x_train, y_train, x, K)
% Input: x_train:
% y_train:
% x:
% K: K
%
% Output: dist: K x ( )
% neighbors: K
%
% Author: Keyven_guo
[size_x,~] = size(x_train);
test_mat = repmat(x,size_x,1); % Matrix[size_x][1] x
% x_train , x
dist_mat = (x_train-double(test_mat)).^2; %
dist_array = sum(dist_mat'); % dist_mat (' ) sum , sum
[dists,neighbors] = sort(dist_arry); % dist_arry neighbors
dists = dists(1:K); % k
neighbors = neighbors(1:K);
end
function result = keyclass(k_labels, class_num)
% , map, Hash
%
% Author: Keyven_guo
k = size(k_labels);
class_count = zeros(1,class_num);
for i=1:k
class_index = k_labels(i) + 1;
class_count(class_index) = class_count(class_index) + 1;
end
result = max(class_count);
result = result - 1;
end
후기
실제 개발 에서 Kd - Tree 를 사용 하지 않 으 면 상기 K 근린 알고리즘 은 다음 과 같은 알고리즘 을 사용 하여 개선 할 수 있 습 니 다.
(1) ACM 알고리즘 문제 에서 앞의 k 작은 요 소 를 찾 습 니 다 (최대 의 사고 방향 으로 대량의 데이터 처리 에 적합 하고 공간 복잡 도가 적 으 며 시간 복잡 도 는 O (n) 에 가 깝 습 니 다.
(2) 데이터 구조 맵
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【MATLAB】변수를 스크립트에 저장MATLAB에서 계산 결과를 저장할 때 MAT 파일, Excel 등의 파일에 저장하는 것이 좋을 것이라고 생각하지만 변수의 유형에 따라 스크립트에 내보낼 수 있습니다. MATLAB을 사용해 10년 정도가 됩니다만, ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.