NPR & Fluids World
Walk into Art with Heart
C++博客
首页
新随笔
联系
聚合
管理
<
2008年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
统计
随笔 - 9
文章 - 0
评论 - 9
引用 - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
(10)
感悟(2)
(rss)
技术(5)
(rss)
学术(3)
(rss)
随笔档案
(9)
2009年4月 (1)
2008年11月 (2)
2008年8月 (1)
2008年7月 (1)
2008年5月 (3)
2008年4月 (1)
others
OpenGL study
搜索
最新评论
1. re: 推荐UUCall
杭州优恒公司洪利富先生你不觉得这样行径过分得太离谱吗?
--洪利富
2. re: 推荐UUCall[未登录]
评论内容较长,点击标题查看
--Henry
3. re: 推荐UUCall
评论内容较长,点击标题查看
--qcd88668
4. re: 推荐UUCall
评论内容较长,点击标题查看
--qcd88668
5. re: 转引自《环保技术联合论坛》——如何做学术报告
这是有道理的。
--北京论坛
阅读排行榜
1. 直方图均衡化的理解--待更新(1189)
2. 转引自《环保技术联合论坛》——如何做学术报告(881)
3. Chinese painting [handwork](843)
4. K-Nearest Neighbor[KNN] Classifier Implementation(614)
5. 网格与网格技术 Study(514)
评论排行榜
1. 直方图均衡化的理解--待更新(1)
2. Present Is A Gift of The God(1)
3. 转引自《环保技术联合论坛》——如何做学术报告(1)
4. [转帖]如何做好研究工作之背景——潘爱民(0)
5. Chinese painting [handwork](0)
K-Nearest Neighbor[KNN] Classifier Implementation
1
double
squared_distance(
double
*
source,
double
*
target,
int
d)
2
{
3
double
res
=
0
;
4
for
(
int
i
=
0
;i
<
d;i
++
)
5
{
6
res
+=
pow(source[i]
-
target[i],
2
);
7
}
8
return
sqrt(res);
9
}
10
11
int
knnLabel(
double
**
p,
int
n,
int
d,
int
*
c,
double
*
x,
int
k,
double
t
=
0
)
12
{
13
assert(k
>
0
&&
k
<=
n
&&
d
>
0
&&
p
&&
c
&&
x);
14
15
if
(t
>
0
)
{
16
t
*=
t;
//
because we use squared distance
17
}
18
19
//
a list of {index => distance} pairs
20
std::list
<
std::pair
<
int
,
double
>
>
nabors;
21
std::list
<
std::pair
<
int
,
double
>
>
::iterator i;
22
for
(
int
j
=
0
; j
<
n; j
++
)
{
23
double
dist
=
squared_distance(p[j], x, d);
24
if
(dist
<=
t)
{
//
a neighbour within acceptable distance found
25
return
c[j];
//
done, immediately report this neighbour's category
26
}
27
28
//
====
29
//
check if p[j] is closer to the target than any recorded neighbours,
30
//
and if positive then sort its index/distance profile into the list.
31
32
//
searching the list for the first one with a longer distance
33
for
(i
=
nabors.begin(); i
!=
nabors.end()
&&
dist
>=
i
->
second; i
++
);
34
35
if
(i
!=
nabors.end()
||
nabors.size()
<
k)
{
//
p[j] qualified
36
nabors.insert(i,
1
, std::pair
<
int
,
double
>
(j, dist));
37
if
(nabors.size()
>
k)
{
//
list overfilled (has k+1 profiles)
38
nabors.pop_back();
//
bumping out the farthest neighbour
39
}
40
}
41
}
42
//
====
43
//
each of the k nearest neighbours cast a vote, and the majority wins
44
//
use class average distance to the target to break any possible ties
45
46
//
a {category => {count => distance}} map
47
std::map
<
int
, std::pair
<
int
,
double
>
>
votes;
48
int
winner
=
c[
0
];
//
randomly assign an initial category
49
50
for
(i
=
nabors.begin(); i
!=
nabors.end(); i
++
)
{
51
int
count
=
++
(votes[c[i
->
first]].first);
52
double
dist
=
(votes[c[i
->
first]].second
+=
i
->
second);
53
if
(count
>
votes[winner].first
||
/**/
/*
check for a possible tie
*/
54
count
==
votes[winner].first
&&
dist
<
votes[winner].second)
{
55
winner
=
c[i
->
first];
56
}
57
}
58
59
return
winner;
60
}
61
posted on 2008-05-22 15:20
Henry Ren
阅读(614)
评论(0)
编辑
收藏
引用
所属分类:
技术
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
《C++ Primer中文版 第三版》学习笔记系列 之 第一章 开始
【AutoDesk 2008 Summer Intern Program 】笔试题整理
K-Nearest Neighbor[KNN] Classifier Implementation
直方图均衡化的理解--待更新
网格与网格技术 Study
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理