/ Published in: C#
                    
                                        
Snippet out of my C# KNN implementation.
Uses leave-one-out cross validation tuning with our given K to find our nearest neighbors.
                Uses leave-one-out cross validation tuning with our given K to find our nearest neighbors.
                            
                                Expand |
                                Embed | Plain Text
                            
                        
                        Copy this code and paste it in your HTML
/// <summary>
/// Given a single tuning data instance and attribute indices, find the
/// k nearest neighbors based on Euclidean distance.
/// </summary>
/// <param name="tune">Single tuning instance</param>
/// <param name="indices">Indices of features used</param>
/// <param name="k">Number of neighbors to find</param>
/// <returns>KVP(double,DataInstance)</returns>
private List<KeyValuePair<double,DataInstance>> _FindNearestNeighbors(DataInstance tune, List<int> indices, int k){
foreach(DataInstance trainingInstance in _DataSet.DataEntries){
if(trainingInstance == tune) continue;
double distance = _ComputeDistance(tune, trainingInstance, indices);
}
return neighbors.OrderBy(n=>n.Key).Take(k).ToList();
}
/// <summary>
/// Computes the Euclidean distance between the DataInstances tune/train using
/// the features located at the given indices.
/// </summary>
/// <param name="indices">Indices of the features used</param>
/// <param name="tune">Single tuning instance</param>
/// <param name="train">Single training instance</param>
/// <returns>Double</returns>
private double _ComputeDistance(DataInstance tune, DataInstance train, List<int> indices){
double d = 0;
foreach(int i in indices){
switch(_DataSet.Features[i].Type){
case Types.continuous:
d += _Distance(tune[i], train[i]);
break;
case Types.discrete:
d += (tune[i] == train[i]) ? 0 : 1;
break;
case Types.output:
default:
break;
}
}
return Math.Sqrt(d);
}
/// <summary>
/// Given two values, compute (x - y)^2.
/// Subroutine for Euclidean Distance computation.
/// </summary>
/// <param name="tune">Value from our local tuning set.</param>
/// <param name="train">Value from our local training set.</param>
/// <returns>Double</returns>
private double _Distance(string tune, string train){
double x = double.Parse(tune);
double y = double.Parse(train);
return Math.Pow(x - y, 2);
}
Comments
 Subscribe to comments
                    Subscribe to comments
                
                