hangscer

K-means算法

2017/05/19

代码写的比较烂,废话多-_-#:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
object Main extends App {
def computeDistence(item1: (Int, Int), µ: (Int, Int)) = (item1._1 - µ._1) * (item1._1 - µ._1) + (item1._2 - µ._2) * (item1._2 - µ._2)
val data = List(1 to 100: _*) map (i => (Random.nextInt(100), Random.nextInt(100)))
var container1: List[(Int, Int)] = List()
var container2: List[(Int, Int)] = List()
var container3: List[(Int, Int)] = List()
var resultList1=container1
var resultList2=container2
var resultList3=container2
var µ1 = data.drop(30).head // 随机初始化 簇中心
var µ2 = data.drop(60).head // 随机初始化 簇中心
var µ3 = data.drop(90).head // 随机初始化 簇中心
for (_ <- 1 to 10) {
resultList1=container1
resultList2=container2
resultList3=container3
container2=Nil
container1=Nil
container3=Nil
data.foreach(item => {
val distence1=computeDistence(item,µ1)
val distence2=computeDistence(item,µ2)
val distence3=computeDistence(item,µ3)
if(distence1<distence2 && distence1<distence3)
container1=List(item)++container1 // 重新把点分类
if(distence2<distence1 && distence2<distence3)
container2=List(item)++container2 // 重新把点分类
if(distence3<distence1 && distence3<distence2)
container3=List(item)++container3 // 重新把点分类
})
µ1 = container1.fold((0, 0))((a, b) => (a._1 + b._1, a._2 + b._2))
µ1 = (µ1._1 / container1.length, µ1._2 / container1.length)//更新簇中心 简单采用几何中心
µ2 = container2.fold((0, 0))((a, b) => (a._1 + b._1, a._2 + b._2))
µ2 = (µ2._1 / container2.length, µ2._2 / container2.length) //更新簇中心
µ3=container3.fold((0,0))((a,b)=>(a._1+b._1,a._2+b._2))
µ3=(µ3._1/container3.length,µ3._2/container3.length)//更新簇中心
}
val f=Figure()
val p=f.subplot(0)
p += scatter(resultList1.map(_._1),resultList1.map(_._2),size = _=>1,colors = _=>Color.BLACK)
p += scatter(resultList2.map(_._1),resultList2.map(_._2),size = _=>1,colors = _=>Color.RED)
p += scatter(resultList3.map(_._1),resultList3.map(_._2),size = _=>1,colors = _=>Color.YELLOW)
f.saveas("ha.png")
}

数据展示如下图:


把现实世界中的客观事物抽成向量,就可以用K-means算法归类.
比如,分析一个公司的客户分类,对不同分类的客户使用不同的商业策略,或是电子商务中分类商品的相似度,归类商品等等。