• Skip to main content
  • Skip to primary sidebar

学習記録

河副 太智

SSEとエルボー法

2017年12月12日 by 河副 太智 Leave a Comment

 

クラスタリングの性能評価関数にSSE(クラスタ内誤差平方和)がある
SSEにより様々なk-meansクラスタリングの性能を評価可能。

SSEの式
print(‘Distortion: %.2f’% km.inertia_)

クラスタ内誤差平方和を出力、クラスターの数を調整して一番低いものが正確

 

 

1
 

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
47
48
49
50
51
52
53
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
 
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
 
# Xには1つのプロットの(x,y)が、yにはそのプロットの所属するクラスター番号が入る
X,y = make_blobs(n_samples=150,         # サンプル点の総数
               n_features=2,          # 特徴量(次元数)の指定  default:2
               centers=3,             # クラスタの個数
               cluster_std=0.5,       # クラスタ内の標準偏差
               shuffle=True,          # サンプルをシャッフル
               random_state=0)        # 乱数生成器の状態を指定
 
km = KMeans(n_clusters=3,        # クラスターの個数
            init='k-means++',           # セントロイドの初期値をランダムに設定  default: 'k-means++'
            n_init=10,               # 異なるセントロイドの初期値を用いたk-meansの実行回数
            max_iter=300,            # k-meansアルゴリズムを繰り返す最大回数
            tol=1e-04,               # 収束と判定するための相対的な許容誤差
            random_state=0)          # 乱数発生初期化
 
y_km = km.fit_predict(X) # クラスターが存在するデータを渡し、各サンプルに対するクラスタ番号を求める
 
plt.scatter(X[y_km==0,0],         # y_km(クラスター番号)が0の時にXの0列目を抽出
                    X[y_km==0,1], # y_km(クラスター番号)が0の時にXの1列目を抽出
                    s=50,
                    c='r',
                    marker='*',
                    label='cluster 1')
plt.scatter(X[y_km==1,0],
                    X[y_km==1,1],
                    s=50,
                    c='b',
                    marker='*',
                    label='cluster 2')
plt.scatter(X[y_km==2,0],
                   X[y_km==2,1],
                    s=50,
                    c='g',
                    marker='*',
                    label='cluster 3')
plt.scatter(km.cluster_centers_[:,0],   # km.cluster_centers_には各クラスターのセントロイドの座標が入っている
                    km.cluster_centers_[:,1],
                    s=250,
                    marker='*',
                    c='black',
                    label='centroids')
plt.legend(loc="best")
plt.grid()
plt.show()
 
print('Distortion: %.2f'% km.inertia_) #クラスタ内誤差平方和を出力、クラスターの数を調整して一番低いものが正確

 

 

 

 

 

しかし、この方法だと一度に一つのクラスタだけしか評価できないのでエルボー法により
forを10回回して10個分のSSEをグラフに表示させ、急降下している部分を見つける事が可能

 

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
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
 
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
 
# Xには1つのプロットの(x,y)が、yにはそのプロットの所属するクラスター番号が入る
X,y = make_blobs(n_samples=150,         # サンプル点の総数
               n_features=2,          # 特徴量(次元数)の指定  default:2
               centers=3,             # クラスタの個数
               cluster_std=0.5,       # クラスタ内の標準偏差
               shuffle=True,          # サンプルをシャッフル
               random_state=0)        # 乱数生成器の状態を指定
 
km = KMeans(n_clusters=3,        # クラスターの個数
            init='k-means++',           # セントロイドの初期値をランダムに設定  default: 'k-means++'
            n_init=10,               # 異なるセントロイドの初期値を用いたk-meansの実行回数
            max_iter=300,            # k-meansアルゴリズムを繰り返す最大回数
            tol=1e-04,               # 収束と判定するための相対的な許容誤差
            random_state=0)          # 乱数発生初期化
 
y_km = km.fit_predict(X) # クラスターが存在するデータを渡し、各サンプルに対するクラスタ番号を求める
 
distortions = []
 
for i  in range(1,11):                # 1~10クラスタまで一気に計算
    km = KMeans(n_clusters=i,
                init='k-means++',     # k-means++法によりクラスタ中心を選択
                n_init=10,
                max_iter=300,
                random_state=0)
    km.fit(X)                         # クラスタリングの計算を実行
    distortions.append(km.inertia_)   # km.fitするとkm.inertia_が得られる
 
plt.plot(range(1,11),distortions,marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')
plt.show()

 

 

Filed Under: 機械学習

k-means

2017年12月12日 by 河副 太智 Leave a Comment

k-means法でのクラスタリング

 

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
import matplotlib.pyplot as plt
import numpy as np
 
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
 
# Xには1つのプロットの(x,y)が、yにはそのプロットの所属するクラスター番号が入る
X,y = make_blobs(n_samples=150,         # サンプル点の総数
               n_features=2,          # 特徴量(次元数)の指定  default:2
               centers=3,             # クラスタの個数
               cluster_std=0.5,       # クラスタ内の標準偏差
               shuffle=True,          # サンプルをシャッフル
               random_state=0)        # 乱数生成器の状態を指定
 
km = KMeans(n_clusters=3, random_state=0)
y_km = km.fit_predict(X)
 
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8,3))
 
ax1.scatter(X[:, 0],
            X[:, 1],
            c='black')
ax1.grid()
 
ax2.scatter(X[y_km==0, 0],
            X[y_km==0, 1],
            c='r',
            s=40,
            label='cluster 1')
ax2.scatter(X[y_km==1, 0],
            X[y_km==1, 1],
            c='b',
            s=40,
            label='cluster 2')
ax2.scatter(X[y_km==2, 0],
            X[y_km==2, 1],
            c='g',
            s=40,
            label='cluster 3')
ax2.grid()
plt.show()

 

 

Filed Under: 機械学習

クラスタリングとデンドログラフ

2017年12月12日 by 河副 太智 Leave a Comment

階層的クラスタリング、デンドログラフという階層を持つ

非階層的クラスタリングも、階層的クラスタリングと同じように
データから似た性質の法則を探し出し、クラスターを作るが階層構造を持たない。

 

非階層的クラスタリングはクラスターの数を開発者が決める
大量のデータを扱うのにてきしており、k-means法が使われる

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
 
from sklearn.datasets import make_blobs
 
# Xには1つのプロットの(x,y)が、yにはそのプロットの所属するクラスター番号が入る
X,y = make_blobs(n_samples=500,         # サンプル点の合計
               n_features=2,          # 特徴量の指定  次元数とも呼ぶ
               centers=3,             # クラスタの個数
               cluster_std=0.5,       # クラスタ内の標準偏差
               shuffle=True,          # シャッフル
               random_state=0)        # 乱数生成器を指定
 
plt.scatter(X[:,0], X[:,1], c='red', marker='*', s=50) #下のサンプルはblack
plt.grid()
plt.show()

 

 

 

 

 

Filed Under: 機械学習

コサイン類似度

2017年12月11日 by 河副 太智 Leave a Comment

コサイン類似度は、2つのベクトルがどれくらい似ているかの指標
2つのベクトル

a⃗ =(a1,a2,⋯,an)
b⃗ =(b1,b2,⋯,bn)

 

の場合以下の式になる

 

コサイン類似度を求める式

1
2
3
4
from scipy.spatial.distance import cosine
vec_a = np.array([1, 2, 3])
vec_b = np.array([2, 3, 4])
print(1 - cosine(vec_a, vec_b))

 

Filed Under: 数学

ユークリッド距離を求める

2017年12月11日 by 河副 太智 Leave a Comment

20121222233259

 

 

1
2
3
4
5
6
7
8
9
10
>>> import numpy
>>> x1 = 2
>>> y1 = 2
>>> x2 = 4
>>> y2 = 6
>>> a = numpy.array([x1, y1])
>>> b = numpy.array([x2, y2])
>>> u = b - a
>>> numpy.linalg.norm(u)
4.4721359549995796

 

 

二点の座標がx(x1,x2),y(y1,y2)

 

のとき、これら二つの距離はピタゴラスの定理で求める
これをn次元空間における二点間にしたものがユークリッド距離

 

 

1
2
3
4
import numpy as np
vec_a = np.array([1, 2, 3])
vec_b = np.array([2, 3, 4])
print(np.linalg.norm(vec_a - vec_b))

 

3次元で2点の座標が与えられた時2点間のユークリッド距離の求め方

  • p(10,20,30),q(30,40,50)

 

1
2
3
4
import numpy as np
vec_a = np.array([10, 20, 30])
vec_b = np.array([30, 40, 50])
print(np.linalg.norm(vec_a - vec_b))

 

上記コードは以下を計算する

 

1
 

Filed Under: 数学

線形重回帰

2017年12月7日 by 河副 太智 Leave a Comment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
 
# データ生成
X, y = make_regression(n_samples=100, n_features=10, n_informative=3, n_targets=1, noise=5.0, random_state=42)
train_X, test_X, train_y, test_y = train_test_split(X, y, random_state=42)
 
 
# モデル構築
model = LinearRegression()
# 学習
model.fit(train_X, train_y)
# test_Xへの推測結果
print(model.predict(test_X))

 

Filed Under: 機械学習

  • « Go to Previous Page
  • Page 1
  • Interim pages omitted …
  • Page 39
  • Page 40
  • Page 41
  • Page 42
  • Page 43
  • Interim pages omitted …
  • Page 66
  • Go to Next Page »

Primary Sidebar

カテゴリー

  • AWS
  • Bootstrap
  • Dash
  • Django
  • flask
  • GIT(sourcetree)
  • Plotly/Dash
  • VPS
  • その他tool
  • ブログ
  • プログラミング
    • Bokeh
    • css
    • HoloViews
    • Jupyter
    • Numpy
    • Pandas
    • PosgreSQL
    • Python 基本
    • python3
      • webアプリ
    • python3解説
    • scikit-learn
    • scipy
    • vps
    • Wordpress
    • グラフ
    • コマンド
    • スクレイピング
    • チートシート
    • データクレンジング
    • ブロックチェーン
    • 作成実績
    • 時系列分析
    • 機械学習
      • 分析手法
      • 教師有り
    • 異常値検知
    • 自然言語処理
  • 一太郎
  • 数学
    • sympy
      • 対数関数(log)
      • 累乗根(n乗根)
    • 暗号学

Copyright © 2025 · Genesis Sample on Genesis Framework · WordPress · Log in