決定境界を引きたい matplotlib python scikit-learn kmeans plotされない
プログラミング(特にpython)初心者です。
センサからデータを取得し、scikit-learnとk-meansを用いてクラスタ分析しています.
matplotlibを使用し可視化しています
今回、この結果に決定境界(svm)を引きたいと思っています。
取得データとの組み合わせがわからぬままサイトを参考にしてプログラムしてみたのですが
コンパイルは通り実行できたものの、結果がplotされません.
なぜ結果が表示されないのか、解決方法、自作取得データとの連携方法など教えていただけると幸いです.
以下ソースコードです
結果が表示されるプログラムに追加で書いています。
追加で書いている部分は「→」が左端にあります。
(ちなみにデータはcsv内にあり、csvからデータを読み取っています)
`#!/usr/bin/env python
# -*- coding: utf-8 -*-
from matplotlib.colors import ListedColormap
from sklearn import datasets
from sklearn.cluster import KMeans
import pandas as pd
import matplotlib.pyplot as pet
→ from sklearn.svm import SVC
import numpy as np
→ import math
def main( →x, y, model, resolution=0.01): \\元はmain()
→ markers = ('s','x')
→ cmap = ListedColormap(('red','blue'))
→ x1_min, x1_max = x[:, 0].min()-1, x[:, 0].max()+1
→ x2_min, x2_max = x[:, 1].min()-1, x[:, 1].max()+1
→ x1_mesh, x2_mesh = np.meshgrid(np.arange(x1_min, x1_max, resolution),
np.arange(x2_min, x2_max, resolution))
→ z = model.predict(np.array([x1_mesh.ravel(), x2_mesh.ravel()]).T)
→ z = z.reshape(x1_mesh.shape)
→ plt.contourf(x1_mesh, x2_mesh, z, alpha=0.4, cmap=cmap)
→ plt.xlim(x1_mesh.min(), x1_mesh.max())
→ plt.ylim(x2_mesh.min(), x2_mesh.max())
→ for idx, cl in enumerate(np.unique(y)):
→ plt.scatter(x=x[y == cl, 0],
→ y=x[y == cl, 1],
→ alpha=0.6,
→ c=cmap(idx),
→ edgecolors='black',
→ marker=marker[idx],
→ label=cl)
→ lr = LogisticRegression(C=10)
→ models = [lr]
→ model_names = ['logistic regression']
→ plt.figure(figsize=(8.6))
→
→ plot_num = 1
→ for model_name, model in zip(model_names, models):
→ plt.subplot(math.ceil(len(models)/2), 2, plot_num)
→ model.fit(x_train, y_train)
→ plot_decision_regions(x_data, y_data, model)
→ plot_num += 1
# クラスタ数
N_CLUSTERS = 2
# Blob データを生成する
##dataset = datasets.make_blobs(centers=N_CLUSTERS)
# 正解ラベルは使わない
# targets = dataset[1]
#csv read
data = pd.read_csv('wdatax.csv',names=('heart','hum'))
#yokoziku sinpaku
#tateziku situdo(hum)
#del(data['cute'])
#del(data['ang'])
#data_array = data.as_matrix().T
data_array = np.array([data['heart'].tolist(),
data['hum'].tolist()], np.float64)
# 特徴データ
features = data_array.T
# クラスタリングする
cls = KMeans(n_clusters=N_CLUSTERS)
pred = cls.fit_predict(features)
# 各要素をラベルごとに色付けして表示する
#ave=np.average(y)
ax=plt.subplot()
for i in range(N_CLUSTERS):
labels = features[pred == i]
plt.scatter(features[:, 0], features[:, 1], c=pred, cmap=cmap)
plt.plot(label='ang')
plt.plot(label='relax')
plt.legend()
# クラスタのセントロイド (重心) を描く
centers = cls.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], s=100,
facecolors='none', edgecolors='black')
# ax.set_ylim([ave*50,ave*80]
##fig, axes = plt.figure()
##plot1 = fig.add_subplot(221)
plt.title("clustering")
ax.set_xlabel('heartrate[-]')
ax.set_ylabel('humidity[%]')
plt.show()
#if __name__ == '__main__':
# main(→x, y, model, resolution=0.01)\\元はmain()
参考にしたサイトはこちらです
http://www.dskomei.com/entry/2018/03/04/125249