<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=K-%EC%B5%9C%EA%B7%BC%EC%A0%91_%EC%9D%B4%EC%9B%83_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</id>
	<title>K-최근접 이웃 알고리즘 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=K-%EC%B5%9C%EA%B7%BC%EC%A0%91_%EC%9D%B4%EC%9B%83_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98"/>
	<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=K-%EC%B5%9C%EA%B7%BC%EC%A0%91_%EC%9D%B4%EC%9B%83_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&amp;action=history"/>
	<updated>2026-07-06T02:49:39Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://www.gaonwiki.com/w/index.php?title=K-%EC%B5%9C%EA%B7%BC%EC%A0%91_%EC%9D%B4%EC%9B%83_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&amp;diff=106844&amp;oldid=prev</id>
		<title>Gaon12: 시작</title>
		<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=K-%EC%B5%9C%EA%B7%BC%EC%A0%91_%EC%9D%B4%EC%9B%83_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&amp;diff=106844&amp;oldid=prev"/>
		<updated>2023-04-20T05:56:37Z</updated>

		<summary type="html">&lt;p&gt;시작&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 개요 ==&lt;br /&gt;
K-최근접 이웃 알고리즘이란 특정공간내에서 입력과 제일 근접한 K개의 요소를 찾아, 더 많이 일치하는 것으로 분류하는 알고리즘이다. [[지도 학습|지도 학습(Supervised Learning)]]의 한 종류로 레이블이 있는 데이터를 사용하여 분류 작업을 한다.&lt;br /&gt;
&lt;br /&gt;
데이터로부터 거리가 가까운 K개의 다른 데이터의 레이블을 참조하여 분류한다. 주로 거리를 측정할 때 유클리디안 거리 계산법을 사용하여 거리를 측정하는데, 벡터의 크기가 커지면 계산이 복잡해진다.&lt;br /&gt;
&lt;br /&gt;
패턴 인식에서 Classification(분류) 혹은 Regression(회귀)에 사용되는 Non-Parametric Statistics(비모수 통계) 방식 알고리즘이다. &amp;lt;s&amp;gt;[[K-방역]]&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 비모수 통계 ==&lt;br /&gt;
모수에 대한 가정을 전제로 하지 않고, 모집단의 형태에 관계없이 주어진 데이터에서 직접 확률을 계산하여 통계학적 검정을 수행하는 분석법이다. 표본수가 적고, 모집단의 분포를 모르는 경우에 적용할 수 있는 통계 기법이다.&lt;br /&gt;
&lt;br /&gt;
== 원리 ==&lt;br /&gt;
새로 입력된 데이터와 기존 데이터 사이의 거리를 계산하고, 새로 입력된 데이터는 가장 가까운 거리에 있는 k개의 데이터들 중 대다수의 특성을 따라간다.&lt;br /&gt;
&lt;br /&gt;
이때 새로운 데이터와 기존 데이터 사이의 거리를 계산하는 방법은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
* Euclidean Distance (유클리드 거리) : 직교좌표계에서 두 점 사이의 거리&lt;br /&gt;
* Hamming Distance (해밍 거리, 중첩 거리) : 같은 길이의 두 문자열에서 같은 위치에서 서로 다른 Symbol들의 개수&lt;br /&gt;
&lt;br /&gt;
== 특징 ==&lt;br /&gt;
* 데이터 기반 분석 방법이다.&lt;br /&gt;
** 어떤 점의 특성을 알고 싶다면 가까이 있는 점으로부터 특성 파악이 가능하다.&lt;br /&gt;
* 데이터의 분포를 신경쓰지 않는다.&lt;br /&gt;
* 회귀문제, 분류문제 등에 적용 가능하다.&lt;br /&gt;
** 회귀 문제&lt;br /&gt;
*** kNN의 값을 평균 내어 값 예측&lt;br /&gt;
** 분류 문제&lt;br /&gt;
*** kNN 중에 가장 많은 항목 선택&lt;br /&gt;
&lt;br /&gt;
* 가까운 이웃이 여럿일 경우에는 거리에 따라 가중치를 주거나, 단독 1등이 나올 때까지 k를 하나씩 줄인다.&lt;br /&gt;
* 데이터가 균일하지 않을 경우, cut-off를 조절하여 사전 데이터가 적은 애들한테 가중치를 준다.&lt;br /&gt;
&lt;br /&gt;
== K값 선택하기 ==&lt;br /&gt;
K의 값을 선택하는 것은 데이터마다 다르게 접근해야 한다. K가 높거나 낮을때 발생할수 있는 문제는 다음과 같다.&lt;br /&gt;
* K가 낮다 → 적은 이웃 수로 판단한다 → 불안정한 결과 ~ 오버피칭&lt;br /&gt;
* K가 높다 → 많은 이웃 수로 판단한다 → 지나친 일반화 ~ 언더피팅&lt;br /&gt;
&lt;br /&gt;
따라서 가장 좋은 성능을 내는 값으로 선택해야 한다. K의 값을 1부터 증가시켜가며 각 점들에 대해 KNN으로 분류해보고 오류 계산&lt;br /&gt;
가장 오류가 적은 K값을 선택해야 한다.&lt;br /&gt;
&lt;br /&gt;
== 데이터 간 거리 구하기 ==&lt;br /&gt;
데이터 간 거리를 구하는 방식은 다음과 같다.&lt;br /&gt;
* Eucledian Distance ( L2 )&lt;br /&gt;
* Manhattan Distance ( L1 )&lt;br /&gt;
* Cosine Distance&lt;br /&gt;
* Hamming Distance ( 곱집합)&lt;br /&gt;
* 자카드거리 ( 집합 )&lt;br /&gt;
* 그외&lt;br /&gt;
** Standardized Euclidean Distance&lt;br /&gt;
** Mahalanobis Distance&lt;br /&gt;
** Correlation Distance&lt;br /&gt;
&lt;br /&gt;
== 장단점 ==&lt;br /&gt;
=== 장점 ===&lt;br /&gt;
알고리즘이 간단하여 구현하기 쉽고, 수치 기반 데이터 분류 작업에서 성능이 좋다. 또한 학습 단계가 필요가 없고, information loss가 없다.&lt;br /&gt;
&lt;br /&gt;
=== 단점 ===&lt;br /&gt;
사전 계산을 할 수 없기 때문에 분류 속도가 느리기에 학습 데이터의 양이 많으면 분류 속도가 느려진다. 또한 차원의 크기가 커지면 계산량이 많아진다. [[차원의 저주]]&lt;br /&gt;
&lt;br /&gt;
모델 생성이 없어서 특징과 클래스간 관계 이해가 제한적이다. 또한 K거리와 갯수를 정해야 하고, 데이터 정규화를 진행해야한다.&lt;br /&gt;
&lt;br /&gt;
== 예시 코드 ==&lt;br /&gt;
=== C++ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;c++&amp;#039;&amp;gt;&lt;br /&gt;
// C++ program to find groups of unknown&lt;br /&gt;
// Points using K nearest neighbour algorithm.&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
#include &amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
  &lt;br /&gt;
struct Point&lt;br /&gt;
{&lt;br /&gt;
    int val;     // Group of point&lt;br /&gt;
    double x, y;     // Co-ordinate of point&lt;br /&gt;
    double distance; // Distance from test point&lt;br /&gt;
};&lt;br /&gt;
  &lt;br /&gt;
// Used to sort an array of points by increasing&lt;br /&gt;
// order of distance&lt;br /&gt;
bool comparison(Point a, Point b)&lt;br /&gt;
{&lt;br /&gt;
    return (a.distance &amp;lt; b.distance);&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
// This function finds classification of point p using&lt;br /&gt;
// k nearest neighbour algorithm. It assumes only two&lt;br /&gt;
// groups and returns 0 if p belongs to group 0, else&lt;br /&gt;
// 1 (belongs to group 1).&lt;br /&gt;
int classifyAPoint(Point arr[], int n, int k, Point p)&lt;br /&gt;
{&lt;br /&gt;
    // Fill distances of all points from p&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++)&lt;br /&gt;
        arr[i].distance =&lt;br /&gt;
            sqrt((arr[i].x - p.x) * (arr[i].x - p.x) +&lt;br /&gt;
                 (arr[i].y - p.y) * (arr[i].y - p.y));&lt;br /&gt;
  &lt;br /&gt;
    // Sort the Points by distance from p&lt;br /&gt;
    sort(arr, arr+n, comparison);&lt;br /&gt;
  &lt;br /&gt;
    // Now consider the first k elements and only&lt;br /&gt;
    // two groups&lt;br /&gt;
    int freq1 = 0;     // Frequency of group 0&lt;br /&gt;
    int freq2 = 0;     // Frequency of group 1&lt;br /&gt;
    for (int i = 0; i &amp;lt; k; i++)&lt;br /&gt;
    {&lt;br /&gt;
        if (arr[i].val == 0)&lt;br /&gt;
            freq1++;&lt;br /&gt;
        else if (arr[i].val == 1)&lt;br /&gt;
            freq2++;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    return (freq1 &amp;gt; freq2 ? 0 : 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 파이썬 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;#039;python&amp;#039;&amp;gt;&lt;br /&gt;
# Survivor Prediction of Titanic using k-NN Algorithm (Scikit-Learn)&lt;br /&gt;
&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import pandas as pd&lt;br /&gt;
import seaborn as sns&lt;br /&gt;
&lt;br /&gt;
from sklearn.neighbors import KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
# Load the dataset&lt;br /&gt;
titanic_bunch = sns.load_dataset(&amp;#039;titanic&amp;#039;)&lt;br /&gt;
titanic_bunch = titanic_bunch.dropna(axis=0) # Drop the rows including NaN &lt;br /&gt;
titanic_bunch[&amp;#039;sex&amp;#039;] = titanic_bunch[&amp;#039;sex&amp;#039;].replace({&amp;#039;female&amp;#039;:0, &amp;#039;male&amp;#039;:1}) # Numericalization of Column &amp;#039;sex&amp;#039;&lt;br /&gt;
titanic_bunch[&amp;#039;embarked&amp;#039;] = titanic_bunch[&amp;#039;embarked&amp;#039;].replace({&amp;#039;C&amp;#039;:0, &amp;#039;S&amp;#039;:1, &amp;#039;Q&amp;#039;:2}) # Numericalization of Column &amp;#039;embarked&amp;#039;&lt;br /&gt;
numeric_column = [&amp;#039;pclass&amp;#039;, &amp;#039;sex&amp;#039;, &amp;#039;age&amp;#039;, &amp;#039;sibsp&amp;#039;, &amp;#039;parch&amp;#039;, &amp;#039;fare&amp;#039;, &amp;#039;embarked&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
# Data separation&lt;br /&gt;
X = titanic_bunch.loc[:, numeric_column]&lt;br /&gt;
y = titanic_bunch.loc[:, &amp;#039;survived&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
# Model Evaluatiuon (Finding the optimum k)&lt;br /&gt;
from sklearn.model_selection import train_test_split&lt;br /&gt;
x_train, x_test, y_train, y_test = train_test_split(&lt;br /&gt;
    X,&lt;br /&gt;
    y,&lt;br /&gt;
    random_state=100&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
model = KNeighborsClassifier(n_neighbors=3)&lt;br /&gt;
model.fit(x_train, y_train)&lt;br /&gt;
&lt;br /&gt;
k_range = range(1, 11)&lt;br /&gt;
train_score = []&lt;br /&gt;
test_score = []&lt;br /&gt;
&lt;br /&gt;
for k in k_range:&lt;br /&gt;
    model = KNeighborsClassifier(n_neighbors=k).fit(x_train, y_train)&lt;br /&gt;
    train_score.append(model.score(x_train, y_train))&lt;br /&gt;
    test_score.append(model.score(x_test, y_test))&lt;br /&gt;
&lt;br /&gt;
# Visualization&lt;br /&gt;
plt.plot(k_range, train_score, label=&amp;#039;Train Accuracy&amp;#039;)&lt;br /&gt;
plt.plot(k_range, test_score, label=&amp;#039;Test Accuracy&amp;#039;)&lt;br /&gt;
plt.xticks(k_range)&lt;br /&gt;
plt.title(&amp;#039;Find Best K-Value in titanic&amp;#039;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
# Scoring&lt;br /&gt;
print(&amp;#039;Training Score:&amp;#039;, model.score(x_train, y_train))&lt;br /&gt;
print(&amp;#039;Evaluation Score:&amp;#039;, model.score(x_test, y_test))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 사용한 자료 ==&lt;br /&gt;
* CC BY로 가져옴&lt;br /&gt;
** https://wooono.tistory.com/88&lt;br /&gt;
** https://dad-rock.tistory.com/990&lt;br /&gt;
** https://doljokilab.tistory.com/12&lt;br /&gt;
** https://rk1993.tistory.com/entry/MLK-NN-알고리즘-실습-기초-버전&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--분류--&amp;gt;&lt;br /&gt;
[[분류:K-최근접 이웃 알고리즘]] [[분류:지도학습]] [[분류:머신러닝]]&lt;/div&gt;</summary>
		<author><name>Gaon12</name></author>
	</entry>
</feed>