KNN算法--投票猜黨派
KNN分類方法可以理解為投票法。把訓(xùn)練數(shù)據(jù)集當(dāng)做選民,K值當(dāng)做這些選民所擁有的選票?,F(xiàn)在從這些這些選民中推選出來(lái)的K位投票人,推選的標(biāo)準(zhǔn) 是和候選黨派(假設(shè)這個(gè)黨派名稱對(duì)選民是保密的,實(shí)際中可以理解為測(cè)試數(shù)據(jù))的政策主張(數(shù)據(jù)特征)相近程度。而這些投票人自己本身又有自己所屬的黨派,他們當(dāng)然把選票投給自己的黨派。得票最多的黨派獲勝,這時(shí)候我們就有較大的把握認(rèn)為得票多的黨派就是候選人的黨派名稱。
一個(gè)手勢(shì)識(shí)別的KNN應(yīng)用實(shí)例
/**
* @param trainingData2
* @param vec2
* @return the distance of two vectors
*/
public double EulerDistance(Double[] trainingData2,double[] vec2){
double tdis = 0.0;
double ans = 0.0;
double dis = 0.0;
for(int i = 0;i<vecLen;i++){
dis = (trainingData2[i] - vec2[i]);
tdis += dis * dis;
}
ans = Math.sqrt(tdis);
return ans;
}
/**
* the Entrance method of this class,from one to six marks the name
* of all the gestures,and this method returns the name of gesture
* that most matching.
* Using KNN algorithm
* @return name of gesture
*/
class Node implements Comparable<Node>{
public double dis;
public int gid;
public Node(int _gid,double _dis) {
this.gid = _gid;
this.dis = _dis;
}
@Override
public int compareTo(Node o) {
if(this.dis > o.dis) return 1;
else if(this.dis < o.dis) return -1;
else return 0;
}
}
public int GestureResult(double[] inData,int k){
ArrayList<Node> nodes = new ArrayList<>();
int[] vote = {0,0,0,0,0,0};
for(int i = 0;i<6;i++){
for(int j = 0;j<60;j++){
nodes.add(new Node(i,EulerDistance(trainingData[i][j], inData)));
}
}
Collections.sort(nodes);
for(int i = 0;i<k;i++){
vote[nodes.get(i).gid]++;
}
int ans_index = 0;
int most = -1;
for(int i = 0;i<6;i++){
if(vote[i] > most){
ans_index = i;
most = vote[i];
}
}
return GestrueName[ans_index];
}