KNN¶
Algorithm¶
K-nearest neighbors classifies a sample using nearby labeled training observations.
Feature scale affects Euclidean distance, so ToyML offers optional standardization.
Training stores the observations; prediction computes their distances to the query
and returns the most frequent label among the k closest observations.
Inputs and limitations¶
- Pass a non-empty list of equally sized finite numeric feature lists and one label per observation.
- Use a positive integer
kno greater than the training sample count.predictaccepts one feature list. - Labels should be immutable, hashable values.
- Select
std_transform=Falsefor already scaled data.
Minimal example¶
from toyml.classification import KNN
samples = [[0.0], [0.2], [4.0], [4.2]]
model = KNN(k=2, std_transform=False).fit(samples, ["near", "near", "far", "far"])
print(model.predict([0.1]))
Numerical stability¶
Compute a scaled Euclidean norm for validated finite coordinates.
With \(d_i = |x_i - y_i|\) and finite \(s = \max_i d_i > 0\):
Scaling keeps the largest squared term at one; fsum reduces summation error. Zero distance is handled before division. An overflowing coordinate difference returns infinity rather than evaluating inf / inf.
Source code in src/toyml/_distance.py
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
API¶
toyml.classification.knn.KNN
dataclass
¶
KNN(k: int, std_transform: bool = True)
K-Nearest Neighbors classification algorithm implementation.
This class implements the K-Nearest Neighbors algorithm for classification tasks. It supports optional standardization of the input data.
Examples:
>>> dataset = [[1.0, 2.0], [2.0, 3.0], [3.0, 4.0], [4.0, 5.0]]
>>> labels = ["A", "A", "B", "B"]
>>> knn = KNN(k=3, std_transform=True).fit(dataset, labels)
>>> knn.predict([2.5, 3.5])
'A'
| ATTRIBUTE | DESCRIPTION |
|---|---|
k |
The number of nearest neighbors to consider for classification.
TYPE:
|
std_transform |
Whether to standardize the input data (default: True).
TYPE:
|
dataset_ |
The fitted dataset (standardized if std_transform is True).
TYPE:
|
labels_ |
The labels corresponding to the fitted dataset.
TYPE:
|
standardizer_ |
The Standardizer instance if std_transform is True.
TYPE:
|
References
- Li Hang
- Tan
- Zhou Zhihua
- Murphy
- Harrington
fit
¶
fit(dataset: list[list[float]], labels: list[Any]) -> KNN
Fit the KNN model to the given dataset and labels.
| PARAMETER | DESCRIPTION |
|---|---|
dataset
|
The input dataset to fit the model to.
TYPE:
|
labels
|
The labels corresponding to the input dataset.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
KNN
|
The fitted KNN instance. |
| RAISES | DESCRIPTION |
|---|---|
ValueError
|
If features, labels, or the neighbor count are invalid. |
TypeError
|
If std_transform is not a boolean. |
Source code in src/toyml/classification/knn.py
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | |
predict
¶
predict(x: list[float]) -> Any
Predict the label of the input data.
| PARAMETER | DESCRIPTION |
|---|---|
x
|
The input data to predict.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
Any
|
The predicted label. |
| RAISES | DESCRIPTION |
|---|---|
ValueError
|
If the model is unfitted or the query or neighbor count is invalid. |
Source code in src/toyml/classification/knn.py
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | |
toyml.classification.knn.Standardizer
dataclass
¶
Standardizer()
A class for standardizing numerical datasets.
Provides methods to fit a standardization model to a dataset, transform datasets using the fitted model, and perform both operations in a single step.
fit
¶
fit(dataset: list[list[float]]) -> Standardizer
Fit the standardization model to the given dataset.
| PARAMETER | DESCRIPTION |
|---|---|
dataset
|
The input dataset to fit the model to.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
Standardizer
|
The fitted Standardizer instance. |
| RAISES | DESCRIPTION |
|---|---|
ValueError
|
If features are empty, inconsistent, non-finite, or cannot be scaled. |
Source code in src/toyml/classification/knn.py
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | |
transform
¶
transform(dataset: list[list[float]]) -> list[list[float]]
Transform the given dataset using the fitted standardization model.
| PARAMETER | DESCRIPTION |
|---|---|
dataset
|
The input dataset to transform.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
list[list[float]]
|
New standardized rows; the input dataset is unchanged. |
| RAISES | DESCRIPTION |
|---|---|
ValueError
|
If unfitted or given invalid or unrepresentable feature values. |
Source code in src/toyml/classification/knn.py
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | |
fit_transform
¶
fit_transform(dataset: list[list[float]]) -> list[list[float]]
Fit the standardization model to the dataset and transform it in one step.
| PARAMETER | DESCRIPTION |
|---|---|
dataset
|
The input dataset to fit and transform.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
list[list[float]]
|
New standardized rows; the input dataset is unchanged. |
Source code in src/toyml/classification/knn.py
200 201 202 203 204 205 206 207 208 209 210 | |
standardization
¶
standardization(dataset: list[list[float]]) -> list[list[float]]
Standardize the given numerical dataset.
The standardization is performed by subtracting the mean and dividing by the standard deviation for each feature. When the standard deviation is 0, all the values in the column are the same, here we set std to 1 to make every value in the column become 0 and avoid division by zero.
| PARAMETER | DESCRIPTION |
|---|---|
dataset
|
The input dataset to standardize.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
list[list[float]]
|
New standardized rows; the input dataset is unchanged. |
| RAISES | DESCRIPTION |
|---|---|
ValueError
|
If the model has not been fitted yet. |
Source code in src/toyml/classification/knn.py
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | |