k-means法の超単純なケースのPythonのコード
2019年の統計検定1級の統計応用の人文科学ではk-means法の初期値依存に関する問題が出ましたが、ここでは実際にk-meansが初期値に依存することを確認するために、超単純なケースのPythonのコードを書いてみました。
状況設定は以下の様にします。
分類する集合:(有限個の)実数を要素とする集合。
クラスターの個数:2つ。
print("最初に部類する集合の要素数を入力してください。")
n = int(input())
print("次に部類する集合の要素を入力してください。")
a = [float(input()) for _ in range(n)]
print("次に初期値を2つ入力してください。")
b = [float(input()) for _ in range(2)]
A = []
B = []
'''
print(A)
print(B)
'''
for i in range(n):
if abs(b[0] - a[i]) <= abs(b[1] - a[i]):
A.append(a[i])
else:
B.append(a[i])
if len(A) == 0 or len(B) == 0:
print("一つ目のクラスターは")
print(A)
print("二つ目のクラスターは")
print(B)
else:
c = sum(A)/len(A)
d = sum(B)/len(B)
while c != b[0] or d != b[1]:
b[0] = c
b[1] = d
A = []
B = []
for i in range(n):
if abs(b[0] - a[i]) <= abs(b[1] - a[i]):
A.append(a[i])
else:
B.append(a[i])
c = sum(A)/len(A)
d = sum(B)/len(B)
print("一つ目のクラスターは")
print(A)
print("二つ目のクラスターは")
print(B)
このコードを初期値を変えて実行した例を2つ下に載せておきます。
ということで、実際に初期値を変えると最終的なクラスターも異なることが確認できました。∩( ・ω・)∩
k-mean法を使って非階層的クラスター分析をするときは注意が必要ですね。
また、初期値ではありませんが、クラスタ数を自動推定する発展形のアルゴリズムとしてG-meansやX-meansといったアルゴリズムが存在します。
(追記:2022年の統計検定1級の人文科学問3でもk-meansの問題が出題されました。)