Skip to content

Commit

Permalink
working knn tests; need to start on pygame based renderer
Browse files Browse the repository at this point in the history
  • Loading branch information
davecom committed May 1, 2024
1 parent a300110 commit 10dcfab
Show file tree
Hide file tree
Showing 10 changed files with 6,514 additions and 0 deletions.
23 changes: 23 additions & 0 deletions KNN/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# KNN/__main__.py
# From Fun Computer Science Projects in Python
# Copyright 2024 David Kopec
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from KNN.knn import KNN

if __name__ == "__main__":
# Parse the file argument
file_parser = ArgumentParser("NanoBASIC")
file_parser.add_argument("basic_file", help="A text file containing NanoBASIC source code.")
arguments = file_parser.parse_args()
execute(arguments.basic_file)
3,823 changes: 3,823 additions & 0 deletions KNN/datasets/digits/digits.csv

Large diffs are not rendered by default.

1,797 changes: 1,797 additions & 0 deletions KNN/datasets/digits/digits_test.csv

Large diffs are not rendered by default.

396 changes: 396 additions & 0 deletions KNN/datasets/digits/license.txt

Large diffs are not rendered by default.

98 changes: 98 additions & 0 deletions KNN/datasets/digits/readme.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
Originally from: https://archive.ics.uci.edu/dataset/80/optical+recognition+of+handwritten+digits

License: https://creativecommons.org/licenses/by/4.0/legalcode

Originally signed: Cathy Blake Sept 3,1998

1. Title of Database: Optical Recognition of Handwritten Digits

2. Source:
E. Alpaydin, C. Kaynak
Department of Computer Engineering
Bogazici University, 80815 Istanbul Turkey
[email protected]
July 1998

3. Past Usage:
C. Kaynak (1995) Methods of Combining Multiple Classifiers and Their
Applications to Handwritten Digit Recognition,
MSc Thesis, Institute of Graduate Studies in Science and
Engineering, Bogazici University.

E. Alpaydin, C. Kaynak (1998) Cascading Classifiers, Kybernetika,
to appear. ftp://ftp.icsi.berkeley.edu/pub/ai/ethem/kyb.ps.Z

4. Relevant Information:
We used preprocessing programs made available by NIST to extract
normalized bitmaps of handwritten digits from a preprinted form. From
a total of 43 people, 30 contributed to the training set and different
13 to the test set. 32x32 bitmaps are divided into nonoverlapping
blocks of 4x4 and the number of on pixels are counted in each block.
This generates an input matrix of 8x8 where each element is an
integer in the range 0..16. This reduces dimensionality and gives
invariance to small distortions.

For info on NIST preprocessing routines, see
M. D. Garris, J. L. Blue, G. T. Candela, D. L. Dimmick, J. Geist,
P. J. Grother, S. A. Janet, and C. L. Wilson, NIST Form-Based
Handprint Recognition System, NISTIR 5469, 1994.

5. Number of Instances
optdigits.tra Training 3823
optdigits.tes Testing 1797

The way we used the dataset was to use half of training for
actual training, one-fourth for validation and one-fourth
for writer-dependent testing. The test set was used for
writer-independent testing and is the actual quality measure.

6. Number of Attributes
64 input+1 class attribute

7. For Each Attribute:
All input attributes are integers in the range 0..16.
The last attribute is the class code 0..9

8. Missing Attribute Values
None

9. Class Distribution
Class: No of examples in training set
0: 376
1: 389
2: 380
3: 389
4: 387
5: 376
6: 377
7: 387
8: 380
9: 382

Class: No of examples in testing set
0: 178
1: 182
2: 177
3: 183
4: 181
5: 182
6: 181
7: 179
8: 174
9: 180

Accuracy on the testing set with k-nn
using Euclidean distance as the metric

k = 1 : 98.00
k = 2 : 97.38
k = 3 : 97.83
k = 4 : 97.61
k = 5 : 97.89
k = 6 : 97.77
k = 7 : 97.66
k = 8 : 97.66
k = 9 : 97.72
k = 10 : 97.55
k = 11 : 97.89

160 changes: 160 additions & 0 deletions KNN/datasets/fish/fish.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
Species,Weight,Length1,Length2,Length3,Height,Width
Bream,242,23.2,25.4,30,11.52,4.02
Bream,290,24,26.3,31.2,12.48,4.3056
Bream,340,23.9,26.5,31.1,12.3778,4.6961
Bream,363,26.3,29,33.5,12.73,4.4555
Bream,430,26.5,29,34,12.444,5.134
Bream,450,26.8,29.7,34.7,13.6024,4.9274
Bream,500,26.8,29.7,34.5,14.1795,5.2785
Bream,390,27.6,30,35,12.67,4.69
Bream,450,27.6,30,35.1,14.0049,4.8438
Bream,500,28.5,30.7,36.2,14.2266,4.9594
Bream,475,28.4,31,36.2,14.2628,5.1042
Bream,500,28.7,31,36.2,14.3714,4.8146
Bream,500,29.1,31.5,36.4,13.7592,4.368
Bream,340,29.5,32,37.3,13.9129,5.0728
Bream,600,29.4,32,37.2,14.9544,5.1708
Bream,600,29.4,32,37.2,15.438,5.58
Bream,700,30.4,33,38.3,14.8604,5.2854
Bream,700,30.4,33,38.5,14.938,5.1975
Bream,610,30.9,33.5,38.6,15.633,5.1338
Bream,650,31,33.5,38.7,14.4738,5.7276
Bream,575,31.3,34,39.5,15.1285,5.5695
Bream,685,31.4,34,39.2,15.9936,5.3704
Bream,620,31.5,34.5,39.7,15.5227,5.2801
Bream,680,31.8,35,40.6,15.4686,6.1306
Bream,700,31.9,35,40.5,16.2405,5.589
Bream,725,31.8,35,40.9,16.36,6.0532
Bream,720,32,35,40.6,16.3618,6.09
Bream,714,32.7,36,41.5,16.517,5.8515
Bream,850,32.8,36,41.6,16.8896,6.1984
Bream,1000,33.5,37,42.6,18.957,6.603
Bream,920,35,38.5,44.1,18.0369,6.3063
Bream,955,35,38.5,44,18.084,6.292
Bream,925,36.2,39.5,45.3,18.7542,6.7497
Bream,975,37.4,41,45.9,18.6354,6.7473
Bream,950,38,41,46.5,17.6235,6.3705
Roach,40,12.9,14.1,16.2,4.1472,2.268
Roach,69,16.5,18.2,20.3,5.2983,2.8217
Roach,78,17.5,18.8,21.2,5.5756,2.9044
Roach,87,18.2,19.8,22.2,5.6166,3.1746
Roach,120,18.6,20,22.2,6.216,3.5742
Roach,0,19,20.5,22.8,6.4752,3.3516
Roach,110,19.1,20.8,23.1,6.1677,3.3957
Roach,120,19.4,21,23.7,6.1146,3.2943
Roach,150,20.4,22,24.7,5.8045,3.7544
Roach,145,20.5,22,24.3,6.6339,3.5478
Roach,160,20.5,22.5,25.3,7.0334,3.8203
Roach,140,21,22.5,25,6.55,3.325
Roach,160,21.1,22.5,25,6.4,3.8
Roach,169,22,24,27.2,7.5344,3.8352
Roach,161,22,23.4,26.7,6.9153,3.6312
Roach,200,22.1,23.5,26.8,7.3968,4.1272
Roach,180,23.6,25.2,27.9,7.0866,3.906
Roach,290,24,26,29.2,8.8768,4.4968
Roach,272,25,27,30.6,8.568,4.7736
Roach,390,29.5,31.7,35,9.485,5.355
Whitefish,270,23.6,26,28.7,8.3804,4.2476
Whitefish,270,24.1,26.5,29.3,8.1454,4.2485
Whitefish,306,25.6,28,30.8,8.778,4.6816
Whitefish,540,28.5,31,34,10.744,6.562
Whitefish,800,33.7,36.4,39.6,11.7612,6.5736
Whitefish,1000,37.3,40,43.5,12.354,6.525
Parkki,55,13.5,14.7,16.5,6.8475,2.3265
Parkki,60,14.3,15.5,17.4,6.5772,2.3142
Parkki,90,16.3,17.7,19.8,7.4052,2.673
Parkki,120,17.5,19,21.3,8.3922,2.9181
Parkki,150,18.4,20,22.4,8.8928,3.2928
Parkki,140,19,20.7,23.2,8.5376,3.2944
Parkki,170,19,20.7,23.2,9.396,3.4104
Parkki,145,19.8,21.5,24.1,9.7364,3.1571
Parkki,200,21.2,23,25.8,10.3458,3.6636
Parkki,273,23,25,28,11.088,4.144
Parkki,300,24,26,29,11.368,4.234
Perch,5.9,7.5,8.4,8.8,2.112,1.408
Perch,32,12.5,13.7,14.7,3.528,1.9992
Perch,40,13.8,15,16,3.824,2.432
Perch,51.5,15,16.2,17.2,4.5924,2.6316
Perch,70,15.7,17.4,18.5,4.588,2.9415
Perch,100,16.2,18,19.2,5.2224,3.3216
Perch,78,16.8,18.7,19.4,5.1992,3.1234
Perch,80,17.2,19,20.2,5.6358,3.0502
Perch,85,17.8,19.6,20.8,5.1376,3.0368
Perch,85,18.2,20,21,5.082,2.772
Perch,110,19,21,22.5,5.6925,3.555
Perch,115,19,21,22.5,5.9175,3.3075
Perch,125,19,21,22.5,5.6925,3.6675
Perch,130,19.3,21.3,22.8,6.384,3.534
Perch,120,20,22,23.5,6.11,3.4075
Perch,120,20,22,23.5,5.64,3.525
Perch,130,20,22,23.5,6.11,3.525
Perch,135,20,22,23.5,5.875,3.525
Perch,110,20,22,23.5,5.5225,3.995
Perch,130,20.5,22.5,24,5.856,3.624
Perch,150,20.5,22.5,24,6.792,3.624
Perch,145,20.7,22.7,24.2,5.9532,3.63
Perch,150,21,23,24.5,5.2185,3.626
Perch,170,21.5,23.5,25,6.275,3.725
Perch,225,22,24,25.5,7.293,3.723
Perch,145,22,24,25.5,6.375,3.825
Perch,188,22.6,24.6,26.2,6.7334,4.1658
Perch,180,23,25,26.5,6.4395,3.6835
Perch,197,23.5,25.6,27,6.561,4.239
Perch,218,25,26.5,28,7.168,4.144
Perch,300,25.2,27.3,28.7,8.323,5.1373
Perch,260,25.4,27.5,28.9,7.1672,4.335
Perch,265,25.4,27.5,28.9,7.0516,4.335
Perch,250,25.4,27.5,28.9,7.2828,4.5662
Perch,250,25.9,28,29.4,7.8204,4.2042
Perch,300,26.9,28.7,30.1,7.5852,4.6354
Perch,320,27.8,30,31.6,7.6156,4.7716
Perch,514,30.5,32.8,34,10.03,6.018
Perch,556,32,34.5,36.5,10.2565,6.3875
Perch,840,32.5,35,37.3,11.4884,7.7957
Perch,685,34,36.5,39,10.881,6.864
Perch,700,34,36,38.3,10.6091,6.7408
Perch,700,34.5,37,39.4,10.835,6.2646
Perch,690,34.6,37,39.3,10.5717,6.3666
Perch,900,36.5,39,41.4,11.1366,7.4934
Perch,650,36.5,39,41.4,11.1366,6.003
Perch,820,36.6,39,41.3,12.4313,7.3514
Perch,850,36.9,40,42.3,11.9286,7.1064
Perch,900,37,40,42.5,11.73,7.225
Perch,1015,37,40,42.4,12.3808,7.4624
Perch,820,37.1,40,42.5,11.135,6.63
Perch,1100,39,42,44.6,12.8002,6.8684
Perch,1000,39.8,43,45.2,11.9328,7.2772
Perch,1100,40.1,43,45.5,12.5125,7.4165
Perch,1000,40.2,43.5,46,12.604,8.142
Perch,1000,41.1,44,46.6,12.4888,7.5958
Pike,200,30,32.3,34.8,5.568,3.3756
Pike,300,31.7,34,37.8,5.7078,4.158
Pike,300,32.7,35,38.8,5.9364,4.3844
Pike,300,34.8,37.3,39.8,6.2884,4.0198
Pike,430,35.5,38,40.5,7.29,4.5765
Pike,345,36,38.5,41,6.396,3.977
Pike,456,40,42.5,45.5,7.28,4.3225
Pike,510,40,42.5,45.5,6.825,4.459
Pike,540,40.1,43,45.8,7.786,5.1296
Pike,500,42,45,48,6.96,4.896
Pike,567,43.2,46,48.7,7.792,4.87
Pike,770,44.8,48,51.2,7.68,5.376
Pike,950,48.3,51.7,55.1,8.9262,6.1712
Pike,1250,52,56,59.7,10.6863,6.9849
Pike,1600,56,60,64,9.6,6.144
Pike,1550,56,60,64,9.6,6.144
Pike,1650,59,63.4,68,10.812,7.48
Smelt,6.7,9.3,9.8,10.8,1.7388,1.0476
Smelt,7.5,10,10.5,11.6,1.972,1.16
Smelt,7,10.1,10.6,11.6,1.7284,1.1484
Smelt,9.7,10.4,11,12,2.196,1.38
Smelt,9.8,10.7,11.2,12.4,2.0832,1.2772
Smelt,8.7,10.8,11.3,12.6,1.9782,1.2852
Smelt,10,11.3,11.8,13.1,2.2139,1.2838
Smelt,9.9,11.3,11.8,13.1,2.2139,1.1659
Smelt,9.8,11.4,12,13.2,2.2044,1.1484
Smelt,12.2,11.5,12.2,13.4,2.0904,1.3936
Smelt,13.4,11.7,12.4,13.5,2.43,1.269
Smelt,12.2,12.1,13,13.8,2.277,1.2558
Smelt,19.7,13.2,14.3,15.2,2.8728,2.0672
Smelt,19.9,13.8,15,16.2,2.9322,1.8792
31 changes: 31 additions & 0 deletions KNN/digit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# KNN/digit.py
# From Fun Computer Science Projects in Python
# Copyright 2024 David Kopec
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from dataclasses import dataclass
from math import dist
from typing import Self


@dataclass
class Digit:
kind: str
pixels: list[int]

@classmethod
def from_string_data(cls, data: list[str]) -> Self:
return cls(kind=data[64], pixels=[int(x) for x in data[:64]])

def distance(self, other: Self) -> float:
return dist(self.pixels, other.pixels)
38 changes: 38 additions & 0 deletions KNN/fish.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# KNN/fish.py
# From Fun Computer Science Projects in Python
# Copyright 2024 David Kopec
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from dataclasses import dataclass
from typing import Self


@dataclass
class Fish:
kind: str
weight: float
length1: float
length2: float
length3: float
height: float
width: float

@classmethod
def from_string_data(cls, data: list[str]) -> Self:
return cls(kind=data[0], weight=float(data[1]), length1=float(data[2]), length2=float(data[3]),
length3=float(data[4]), height=float(data[5]), width=float(data[6]))

def distance(self, other: Self) -> float:
return ((self.length1 - other.length1) ** 2 + (self.length2 - other.length2) ** 2 +
(self.length3 - other.length3) ** 2 + (self.height - other.height) ** 2 +
(self.width - other.width) ** 2) ** 0.5
Loading

0 comments on commit 10dcfab

Please sign in to comment.