<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>「KMeans」タグの記事一覧Python Tech</title>
	<atom:link href="https://tech.nkhn37.net/tag/kmeans/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Sun, 23 Nov 2025 00:33:49 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://tech.nkhn37.net/wp-content/uploads/2021/01/cropped-lion-normal-clear-1-32x32.png</url>
	<title>「KMeans」タグの記事一覧Python Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【scikit-learn】KMeansでk-means法によるクラスタリングをする方法</title>
		<link>https://tech.nkhn37.net/scikit-learn-kmeans/</link>
					<comments>https://tech.nkhn37.net/scikit-learn-kmeans/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Sat, 03 Sep 2022 20:00:00 +0000</pubDate>
				<category><![CDATA[scikit-learn]]></category>
		<category><![CDATA[KMeans]]></category>
		<category><![CDATA[エルボー法]]></category>
		<category><![CDATA[クラスタリング]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=4580</guid>

					<description><![CDATA[Python の機械学習ライブラリである sciki-learn の KMeans を使って k-means 法によるクラスタリングを行う方法を解説します。 k-means 法によるクラスタリング k-means 法とは [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python の機械学習ライブラリである sciki-learn の <span class="jinr-d--text-color d--marker1 d--bold"><code>KMeans</code> を使って k-means 法によるクラスタリングを行う方法</span>を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">k-means 法によるクラスタリング</h2>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">k-means</span> 法とは、教師なし学習で代表的なクラスタリングの中でも有名な手法の 1 つです。分類アルゴリズムの k-近傍法とは異なるため注意しましょう。</p>



<p class="wp-block-paragraph">k-means 法のアルゴリズムの手順概要は以下のようになります。</p>



<ol class="wp-block-list jinr-list">
<li>データの中からk個のデータ点を任意に抽出して、初期値のセントロイドとして設定する。その後に、以下の 2、3 のステップを反復する。</li>



<li>全てのデータ点を最も近いセントロイドにそれぞれ割り振る。</li>



<li>各 k 個のセントロイドに割り振られたデータの重心を計算して、その重心を新しいセントロイドとして更新する。</li>
</ol>



<p class="wp-block-paragraph">ここでセントロイドと言っているのは、各クラスタの中心の事です。</p>



<p class="wp-block-paragraph">k-means 法では、SSE（Sum of Squared Errors）というクラスタ内の誤差平方和を用いて、この SSE を最小化するようにセントロイドが選ばれます。また、k-means 法は、クラスタ数を事前に指定しないとクラスタリングできないことも特徴です。</p>



<p class="wp-block-paragraph">k-means 法によるクラスタリングは、Python の機械学習ライブラリである scikit-learn にて <span class="jinr-d--text-color d--marker1 d--bold"><code>KMeans</code></span> として実装がされています。</p>



<p class="wp-block-paragraph">この記事では、<code>KMeans</code> を使ったクラスタリング方法の実装例を紹介します。また、クラスタ数を決める方法の 1 つであるエルボー法についても説明します。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">k-近傍法については「<a href="https://tech.nkhn37.net/scikit-learnk-kneighborsclassifier/" target="_blank" rel="noreferrer noopener">k近傍法（k-NN）を用いたデータ分類方法</a>」を参考にしてください。</p>
</div>
		</div></section>



<h2 class="wp-block-heading jinr-heading d--bold"><code>KMeans</code> を使ったクラスタリング</h2>



<h3 class="wp-block-heading jinr-heading d--bold">k-menas 法の使い方（<code>sklearn.cluster.KMeans</code>）</h3>



<h4 class="wp-block-heading jinr-heading d--bold">実装例</h4>



<p class="wp-block-paragraph">scikit-learn の <code>make_blogs</code> でクラスタリング用のデータを用意し、<span class="jinr-d--text-color d--marker1 d--bold"><code>KMeans</code></span> を使ってk-means 法によるクラスタリングをする方法について紹介します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans


def main():
    """メイン関数"""
    np.random.seed(1)

    # ===== データの生成
    k = 5
    data, label = make_blobs(n_samples=500, n_features=2, centers=k, cluster_std=1.0)

    # ===== k-meansクラスタリング
    km = KMeans(n_clusters=k)
    pred = km.fit_predict(data)

    # ===== SSE値を出力
    print(f"SSE: {km.inertia_:.2f}")

    # ===== クラスタリング結果を描画する
    fig, ax = plt.subplots(1, 2, figsize=(10, 5))
    # 元データを表示する
    ax[0].scatter(data[:, 0], data[:, 1])
    ax[0].set_title("original data")
    # クラスタリング結果を表示する
    for i in range(k):
        ax[1].scatter(data[pred == i, 0], data[pred == i, 1])
    ax[1].set_title("k-means clustering")
    plt.show()


if __name__ == "__main__":
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
SSE: 894.48</pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="998" height="497" src="https://tech.nkhn37.net/wp-content/uploads/2022/09/image.png" alt="k-means クラスタリング" class="wp-image-4583" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/09/image.png 998w, https://tech.nkhn37.net/wp-content/uploads/2022/09/image-300x149.png 300w, https://tech.nkhn37.net/wp-content/uploads/2022/09/image-768x382.png 768w" sizes="(max-width: 998px) 100vw, 998px" /></figure>
</div>


<h4 class="wp-block-heading jinr-heading d--bold">実装内容の解説</h4>



<p class="wp-block-paragraph">上記で紹介して実装例の各部分ごとに内容を解説していきます。</p>



<p class="wp-block-paragraph"><strong>必要モジュールのインポート</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from sklearn.cluster import KMeans</pre>



<p class="wp-block-paragraph">k-means クラスタリングを使用するには、<code>sklearn.cluster</code> から <code>KMeans</code> をインポートします。他にも NumPy 等インポートしていますが説明は省略します。</p>



<p class="wp-block-paragraph"><strong>データセットの準備</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    np.random.seed(1)

    # ===== データの生成
    k = 5
    data, label = make_blobs(n_samples=500, n_features=2, centers=k, cluster_std=1.0)</pre>



<p class="wp-block-paragraph">データは、<code>make_blobs</code> を使用して生成します。引数として指定しているのは以下の項目です。</p>



<ul class="wp-block-list jinr-list">
<li><code>n_sample</code>：データの点数</li>



<li><code>n_features</code>：データの次元数</li>



<li><code>centers</code>：クラスタの数</li>



<li><code>cluster_std</code>：各クラスタの標準偏差</li>
</ul>



<p class="wp-block-paragraph">今回は、5 つのクラスタを作成しています。また、教師なし学習のため、<code>label</code> の方は使用していません。乱数シードは、<code>np.random.seed</code> で設定していますが、<code>make_blobs</code> の <code>random_state</code> 引数で指定することも可能です。</p>



<p class="wp-block-paragraph"><strong>k-means クラスタリングの実行</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    # ===== k-meansクラスタリング
    km = KMeans(n_clusters=k)
    pred = km.fit_predict(data)</pre>



<p class="wp-block-paragraph">上記の部分で k-means クラスタリングを実行しています。<code>n_clusters</code> でクラスタ数を指定し、クラスタリングは <code>fit_predict</code> メソッドを使って実行します。</p>



<p class="wp-block-paragraph"><strong>SSE（誤差平方和）の取得</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    # ===== SSE値を出力
    print(f"SSE: {km.inertia_:.2f}")</pre>



<p class="wp-block-paragraph">計算された SSE（誤差平方和）については <code>inertia_</code> で取得できます。</p>



<p class="wp-block-paragraph"><strong>クラスタリング結果の表示</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    # ===== クラスタリング結果を描画する
    fig, ax = plt.subplots(1, 2, figsize=(10, 5))
    # 元データを表示する
    ax[0].scatter(data[:, 0], data[:, 1])
    ax[0].set_title("original data")
    # クラスタリング結果を表示する
    for i in range(k):
        ax[1].scatter(data[pred == i, 0], data[pred == i, 1])
    ax[1].set_title("k-means clustering")
    plt.show()</pre>



<p class="wp-block-paragraph">上記の部分は、元データとクラスタリング結果を横に並べて表示している部分です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="998" height="497" src="https://tech.nkhn37.net/wp-content/uploads/2022/09/image.png" alt="k-means クラスタリング" class="wp-image-4583" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/09/image.png 998w, https://tech.nkhn37.net/wp-content/uploads/2022/09/image-300x149.png 300w, https://tech.nkhn37.net/wp-content/uploads/2022/09/image-768x382.png 768w" sizes="(max-width: 998px) 100vw, 998px" /></figure>
</div>


<p class="wp-block-paragraph">結果を再掲しますが、5 クラスのデータに分類できていることが分かります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">エルボー法によるクラスタ数の決定</h3>



<p class="wp-block-paragraph">k-means 法によるクラスタリングでは、実行前にクラスタ数を決めて指定する必要があります。上記例では、方法の説明のために分かりやすいように 5 つのクラスタのデータセットを作り、そのデータセットに対して <code>k=5</code> で k-means クラスタリングを実行したため、きれいにクラスタリングができていました。</p>



<p class="wp-block-paragraph">しかし、実際の適用場面では、データがいくつのクラスタになるかは事前に分かりません。では、k の数をどう決めればよいでしょうか。</p>



<p class="wp-block-paragraph">クラスタ数を決めるときに参考になる手法として<span class="jinr-d--text-color d--marker1 d--bold">エルボー法</span>という方法があります。エルボー法では、k-means に指定するクラスタ数の数を増やしていったときに SSE がどのように変化するかをプロットし、その結果からクラスタ数を決定する方法です。</p>



<p class="wp-block-paragraph">クラスタ数を増やしていって SSE をプロットするとグラフが、かくっと曲がって変化が少なくなる部分が出てきます。エルボー法では、この時のクラスタ数を最適とします。なぜ「エルボー」というかというと SSE のプロット形状が肘が曲がっているように見えるためです。</p>



<p class="wp-block-paragraph">では、エルボー法でクラスタ数を調べてみるサンプルプログラムを見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans


def main():
    """メイン関数"""
    np.random.seed(1)

    # ===== データの生成
    k = 5
    data, label = make_blobs(n_samples=500, n_features=2, centers=k, cluster_std=1.0)

    # ===== エルボー法
    sse = []
    for k in range(1, 11):
        km = KMeans(n_clusters=k)
        km.fit(data)
        sse.append(km.inertia_)

    # ===== SSE値をプロットする
    plt.plot(range(1, 11), sse, "o-")
    plt.title("elbow method")
    plt.xlabel("number of clusters")
    plt.ylabel("sse")
    plt.show()


if __name__ == "__main__":
    main()</pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="637" height="479" src="https://tech.nkhn37.net/wp-content/uploads/2022/09/image-1.png" alt="エルボー法 SSE" class="wp-image-4585" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/09/image-1.png 637w, https://tech.nkhn37.net/wp-content/uploads/2022/09/image-1-300x226.png 300w" sizes="(max-width: 637px) 100vw, 637px" /></figure>
</div>


<p class="wp-block-paragraph">上記では、k を 1 ~ 10 まで変えつつ、<code>KMeans</code> を使った k-means クラスタリングを実行しています。そして、図は各 k における SSE の値をリストに蓄積してグラフにプロットしたものになります。</p>



<p class="wp-block-paragraph">この結果を見るとクラスタ数が 5 のところまでは降下が大きいのに対して 5 以降については緩やかになっているように見えます。このため、k の適切な値は 5 ではないかと予想できます。これがエルボー法での考え方です。</p>



<p class="wp-block-paragraph">今回は、分かりやすい分類データを使っているため、きれいなプロット図ですが、現実の問題に対しては、これほどきれいにならない場合がほとんどかと思います。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Python の機械学習ライブラリである sciki-learn の <span class="jinr-d--text-color d--marker1 d--bold"><code>KMeans</code> を使って k-means 法によるクラスタリング</span>を行う方法を解説してきました。また、k-means にて指定するクラスタ数を決める 1 つの方法である<span class="jinr-d--text-color d--marker1 d--bold">エルボー法</span>についても紹介しています。</p>



<p class="wp-block-paragraph">k-means 法は、教師なし学習で代表的なクラスタリングの中でも有名な手法です。scikit-learn の <code>KMeans</code> の使い方も簡単なため、色々な例で試してみてください。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">sklearn.cluster.KMeans の公式ドキュメントは<a href="https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn-cluster-kmeans" target="_blank" rel="noreferrer noopener">こちら</a>を参照してください。</p>
</div>
		</div></section>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-data-analysis/scikit-learn/kmeans" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/scikit-learn-kmeans/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: tech.nkhn37.net @ 2026-06-13 13:47:12 by W3 Total Cache
-->