質問編集履歴
1
見出し、シンタックスハイライトを付けました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
学校でK-MEANS(k平均法)をpython3で実装する課題をやっています。
|
1
|
+
##学校でK-MEANS(k平均法)をpython3で実装する課題をやっています。
|
2
2
|
|
3
3
|
クラスタリングの箇所がうまくいかなくて悩んでいます。
|
4
4
|
|
@@ -8,49 +8,53 @@
|
|
8
8
|
|
9
9
|
|
10
10
|
↓最初にユークリッド関数を定義して
|
11
|
-
|
11
|
+
```lang-python
|
12
|
-
def EucDist(a,b)
|
12
|
+
def EucDist(a,b)
|
13
13
|
"""
|
14
14
|
ユーグリット距離を求める関数
|
15
15
|
"""
|
16
16
|
return np.sqrt(np.power(a-b, 2).sum())
|
17
17
|
|
18
|
-
|
18
|
+
```
|
19
19
|
↓irisデータを読み込んで
|
20
|
-
|
20
|
+
```
|
21
21
|
f = open("iris.data","r")
|
22
22
|
text = f.read()
|
23
23
|
f.close
|
24
|
-
|
24
|
+
```
|
25
25
|
↓カンマで区切って
|
26
|
+
```
|
26
27
|
a=text.replace("\n",",")#改行をカンマに変える
|
27
28
|
b=a.split(",")#カンマで区切る
|
28
29
|
c=[b[i:i+5] for i in range(0,752,5)]#4次元の座標データとクラスター
|
29
30
|
c
|
30
|
-
|
31
|
+
```
|
31
32
|
↓座標点とクラスに分けて
|
33
|
+
```
|
32
34
|
data=[]
|
33
35
|
for i in range(150):
|
34
36
|
i=i*5
|
35
37
|
cb = [[float(b[i]),float(b[i+1]),float(b[i+2]),float(b[i+3])],b[i+4]]
|
36
38
|
data.append(cb)
|
37
39
|
data
|
38
|
-
|
40
|
+
```
|
39
41
|
↓座標点だけ取りだして
|
42
|
+
```
|
40
43
|
cd = []#irisデータの座表点のみ格納するリスト
|
41
44
|
for i in range(len(data)):
|
42
45
|
cd.append(data[i][0])
|
43
46
|
cd
|
44
|
-
|
47
|
+
```
|
45
48
|
↓重心の初期値をirisデータからランダムに選んで
|
49
|
+
```
|
46
50
|
k=3
|
47
51
|
cent=[]
|
48
52
|
for i in range(k):
|
49
53
|
cent.append(random.choice(cd))#cdからランダムに重心を3つ取り出す
|
50
54
|
cent
|
51
|
-
|
55
|
+
```
|
52
56
|
↓クラスタリング
|
53
|
-
|
57
|
+
```
|
54
58
|
cmp=[]#ユークリッド距離を一時的に格納するリスト
|
55
59
|
k0=[]#クラスタ1を格納するリスト
|
56
60
|
k1=[]#クラスタ2を格納するリスト
|
@@ -78,7 +82,7 @@
|
|
78
82
|
print("クラスタ1: ",k0)
|
79
83
|
print("クラスタ2: ",k1)
|
80
84
|
print("クラスタ3: ",k2)
|
81
|
-
|
85
|
+
```
|
82
86
|
実行すると各クラスタのリストに何も要素が入らなかったです。
|
83
87
|
|
84
88
|
この後、各リストに入っている座標の平均を求め、それを新たな重心値として上記のソースコードの処理
|