質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

2回答

3266閲覧

相関関係をクラスタリングしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/09/20 08:29

編集2019/09/20 08:39

動画内のある輝点を指定して、RGBで強度を出しています。その際2つの点の相関関係を出しています。

下図に示した相関関係をk-meansでクラスタリングしたいです。

sk-learn.clusterをインストールしていろいろ試しましたがうまくいかないです。

python

1# -*- coding: utf-8 -*- 2import cv2 3import matplotlib.pyplot as plt 4from numpy import * 5import pandas as pd 6from scipy import signal 7from sklearn.cluster import KMeans 8 9video_path = "water50_2.mkv" 10cap = cv2.VideoCapture(video_path) 11 12count = cap.get(cv2.CAP_PROP_FRAME_COUNT) 13fps = cap.get(cv2.CAP_PROP_FPS) 14 15numS=raw_input("start frame: ") 16numS=int(numS) 17 18numE=raw_input("end frame: ") 19numE=int(numE) 20#numE=count 21print(numE) 22 23# 場所を決める 24#点滅の場所 25x1min=raw_input("点滅1左上のx座標:") 26y1min=raw_input("点滅1左上のy座標:") 27x1max=raw_input("点滅1右下のx座標:") 28y1max=raw_input("点滅1右下のy座標:") 29 30X1min=int(x1min) 31Y1min=int(y1min) 32X1max=int(x1max) 33Y1max=int(y1max) 34 35 36 37#ノイズの場所 38xnoisemin=raw_input("左上ノイズx座標:") 39ynoisemin=raw_input("左上ノイズy座標:") 40xnoisemax=raw_input("右下ノイズx座標:") 41ynoisemax=raw_input("右下ノイズy座標:") 42 43Xnoisemin=int(xnoisemin) 44Ynoisemin=int(ynoisemin) 45Xnoisemax=int(xnoisemax) 46Ynoisemax=int(ynoisemax) 47 48# フレーム [numS,numE] の範囲で各フレームの [ymin, ymax]x[xmin, xmax] の画素の平均を計算する。 49frame_no = arange(numS,numE) 50intensity1 = [] 51intensity2=[] 52intensity3=[] 53intensitynoise=[] 54for i in frame_no: 55 # フレーム frame_no を取得する。 56 cap.set(cv2.CAP_PROP_POS_FRAMES, i) 57 ret, frame = cap.read() 58 if not ret: 59 print('Failed to grab frame.') 60 break 61 # 平均画素値を計算する。 62 intensity1.append(frame[Y1min:Y1max+1, X1min:X1max+1].mean()) 63 intensitynoise.append(frame[Ynoisemin:Ynoisemax+1, Xnoisemin:Xnoisemax+1].mean()) 64 print "frame number ",i 65 66plt.plot(intensity1,intensitynoise,'x') 67corr=corrcoef(intensity1,intensitynoise) 68a=corr[0,1] 69print(a) 70pred=KMeans(n_clusters=3).fit(a) 71plt.xlabel("left intensity") 72plt.ylabel("right intensity") 73plt.title("Correlation coefficient:%s"%a) 74plt.show()

イメージ説明

例えば以上のコードで実行すると以下のエラーメッセージが出てきます

Traceback (most recent call last):
File "散布図と相関係数.py", line 90, in <module>
pred=KMeans(n_clusters=3).fit(a)
File "/usr/lib/python2.7/dist-packages/sklearn/cluster/k_means_.py", line 887, in fit
X = self.check_fit_data(X)
File "/usr/lib/python2.7/dist-packages/sklearn/cluster/k_means
.py", line 861, in _check_fit_data
X.shape[0], self.n_clusters))
ValueError: n_samples=1 should be >= n_clusters=3


(program exited with code: 1)
Press return to continue

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nandymak

2019/09/20 08:32

何が上手く行かないのでしょうか?具体的に書かれた方が回答が付きやすいと思います。
guest

回答2

0

python

1a=corr[0,1] 2print(a) 3pred=KMeans(n_clusters=3).fit(a)

aが1つだけ取り出した値なので、そもそもおかしいです。
(スカラーなので違うエラーになる気もするけど、どのみち間違っている)


さて、

相関関係をk-meansでクラスタリングしたい

相関行列を距離の遠近とみなしてクラスタリングするのか、単に二次元空間上でやるのかでだいぶ変わってくると思います。

前者であれば、k-meansのアルゴリズム(と実装)は不向きですから、他のアルゴリズムで行ってください。

後者であれば、xとyを特徴量の配列にする、つまり

python

1X = np.stack([intensity1,intensitynoise], axis=1) 2km = KMeans(n_clusters=3) 3pred = km.fit_predict(X)

みたいな感じで処理すればできるでしょう。あとは適宜プロットしてください(色分けの方法などは調べれば出てきます)。


あと、python2を使っているようですが、今からpython2で新たにコードを書くのはおすすめしません。

投稿2019/09/20 12:26

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーコードの通りではありませんか?

ValueError: n_samples=1 should be >= n_clusters=3

データ数はクラスタリング数より多くなるはずです。

投稿2019/09/20 10:02

meg_

総合スコア10580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問