クラスタリングのデータ出力をプロットする方法は?


15

一連のデータ(一連のマーク)をクラスタリングしてみて、2つのクラスターを得ました。グラフィカルに表現したいと思います。私は(x、y)座標を持っていないので、表現について少し混乱しています。

そのためのMATLAB / Python関数も探しています。

編集

データを投稿すると、質問がより明確になると思います。Pythonでkmeansクラスタリングを使用して(scipyを使用せずに)作成した2つのクラスターがあります。彼らです

class 1: a=[3222403552.0, 3222493472.0, 3222491808.0, 3222489152.0, 3222413632.0, 
3222394528.0, 3222414976.0, 3222522768.0, 3222403552.0, 3222498896.0, 3222541408.0, 
3222403552.0, 3222402816.0, 3222588192.0, 3222403552.0, 3222410272.0, 3222394560.0, 
3222402704.0, 3222298192.0, 3222409264.0, 3222414688.0, 3222522512.0, 3222404096.0, 
3222486720.0, 3222403968.0, 3222486368.0, 3222376320.0, 3222522896.0, 3222403552.0, 
3222374480.0, 3222491648.0, 3222543024.0, 3222376848.0, 3222403552.0, 3222591616.0, 
3222376944.0, 3222325568.0, 3222488864.0, 3222548416.0, 3222424176.0, 3222415024.0, 
3222403552.0, 3222407504.0, 3222489584.0, 3222407872.0, 3222402736.0, 3222402032.0, 
3222410208.0, 3222414816.0, 3222523024.0, 3222552656.0, 3222487168.0, 3222403728.0, 
3222319440.0, 3222375840.0, 3222325136.0, 3222311568.0, 3222491984.0, 3222542032.0, 
3222539984.0, 3222522256.0, 3222588336.0, 3222316784.0, 3222488304.0, 3222351360.0, 
3222545536.0, 3222323728.0, 3222413824.0, 3222415120.0, 3222403552.0, 3222514624.0, 
3222408000.0, 3222413856.0, 3222408640.0, 3222377072.0, 3222324304.0, 3222524016.0, 
3222324000.0, 3222489808.0, 3222403552.0, 3223571920.0, 3222522384.0, 3222319712.0, 
3222374512.0, 3222375456.0, 3222489968.0, 3222492752.0, 3222413920.0, 3222394448.0, 
3222403552.0, 3222403552.0, 3222540576.0, 3222407408.0, 3222415072.0, 3222388272.0, 
3222549264.0, 3222325280.0, 3222548208.0, 3222298608.0, 3222413760.0, 3222409408.0, 
3222542528.0, 3222473296.0, 3222428384.0, 3222413696.0, 3222486224.0, 3222361280.0, 
3222522640.0, 3222492080.0, 3222472144.0, 3222376560.0, 3222378736.0, 3222364544.0, 
3222407776.0, 3222359872.0, 3222492928.0, 3222440496.0, 3222499408.0, 3222450272.0, 
3222351904.0, 3222352480.0, 3222413952.0, 3222556416.0, 3222410304.0, 3222399984.0, 
3222494736.0, 3222388288.0, 3222403552.0, 3222323824.0, 3222523616.0, 3222394656.0, 
3222404672.0, 3222405984.0, 3222490432.0, 3222407296.0, 3222394720.0, 3222596624.0, 
3222597520.0, 3222598048.0, 3222403552.0, 3222403552.0, 3222403552.0, 3222324448.0, 
3222408976.0, 3222448160.0, 3222366320.0, 3222489344.0, 3222403552.0, 3222494480.0, 
3222382032.0, 3222450432.0, 3222352000.0, 3222352528.0, 3222414032.0, 3222728448.0, 
3222299456.0, 3222400016.0, 3222495056.0, 3222388848.0, 3222403552.0, 3222487568.0, 
3222523744.0, 3222394624.0, 3222408112.0, 3222406496.0, 3222405616.0, 3222592160.0, 
3222549360.0, 3222438560.0, 3222597024.0, 3222597616.0, 3222598128.0, 3222403552.0, 
3222403552.0, 3222403552.0, 3222499056.0, 3222408512.0, 3222402064.0, 3222368992.0, 
3222511376.0, 3222414624.0, 3222554816.0, 3222494608.0, 3222449792.0, 3222351952.0, 
3222352272.0, 3222394736.0, 3222311856.0, 3222414288.0, 3222402448.0, 3222401056.0, 
3222413568.0, 3222298848.0, 3222297184.0, 3222488000.0, 3222490528.0, 3222394688.0, 
3222408224.0, 3222406672.0, 3222404896.0, 3222443120.0, 3222403552.0, 3222596400.0, 
3222597120.0, 3222597712.0, 3222400896.0, 3222403552.0, 3222403552.0, 3222403552.0, 
3222299200.0, 3222321296.0, 3222364176.0, 3222602208.0, 3222513040.0, 3222414656.0, 
3222564864.0, 3222407904.0, 3222449984.0, 3222352096.0, 3222352432.0, 3222452832.0, 
3222368560.0, 3222414368.0, 3222399376.0, 3222298352.0, 3222573152.0, 3222438080.0, 
3222409168.0, 3222523488.0, 3222394592.0, 3222405136.0, 3222490624.0, 3222406928.0, 
3222407104.0, 3222442464.0, 3222403552.0, 3222596512.0, 3222597216.0, 3222597968.0, 
3222438208.0, 3222403552.0, 3222403552.0, 3222403552.0]

class 2: b=[3498543128.0, 3498542920.0, 3498543252.0, 3498543752.0, 3498544872.0, 
3498544528.0, 3498543024.0, 3498542548.0, 3498542232.0]

プロットしたいです。私が以下を試してみたところ、プロットaしたときに次の結果が得られましたb

pylab.plot(a,'x')
pylab.plot(b,'o')
pylab.show()

ここに画像の説明を入力してください

クラスタリングの視覚化を改善できますか?


1
それは本当にあなたがクラスタリングをしたかどうかに依存します:)あなたが持っているデータの小さな例を示すならば、あなたは答えを得ることを確信しています
デビッドw

1
異なる色とマーカーを使用するのが、最も簡単で読みやすい傾向があります。クラスターが2つだけの場合は、異なる値に対して0/1またはO / Xを印刷できます。
マルチン

「マークのセット」とはどういう意味か教えてください。クラスターを特徴付ける変数はいくつありますか?また、使用するクラスターの最適な数は2であると確信していますか?多くの場合、クラスター分析プログラムを繰り返し使用する必要があります。最初は2つしか得られないかもしれませんが、いくつかの調整により、より興味深く有益なより高い数を得るかもしれません。
rolando2

私は明示的にクラスタ数を与えなければならない関数kmeans使用
user2721

@ user2721、kmeansの使用方法を教えてください。
シグル

回答:


30

通常、散布図(または散布図の行列が多数ある場合)に元の値をプロットし、色を使用してグループを表示します。

あなたはPythonで答えを求めました、そしてあなたは実際にすべてのクラスタリングとプロットをscipy、numpy、matplotlibで行います:

データを作成することから始めます

import numpy as np
from scipy import cluster
from matplotlib import pyplot

np.random.seed(123)
tests = np.reshape( np.random.uniform(0,100,60), (30,2) )
#tests[1:4]
#array([[ 22.68514536,  55.13147691],
#       [ 71.94689698,  42.31064601],
#       [ 98.07641984,  68.48297386]])

クラスターはいくつありますか?

これはk-meansについて難しいことであり、多くの方法があります。肘メソッドを使用ましょう

#plot variance for each value for 'k' between 1,10
initial = [cluster.vq.kmeans(tests,i) for i in range(1,10)]
pyplot.plot([var for (cent,var) in initial])
pyplot.show()

肘プロット

観測値をクラスに割り当て、プロットします

私は、インデックス3(つまり4つのクラスター)がどれほど優れていると考えていますか

cent, var = initial[3]
#use vq() to get as assignment for each obs.
assignment,cdist = cluster.vq.vq(tests,cent)
pyplot.scatter(tests[:,0], tests[:,1], c=assignment)
pyplot.show()

散布図

既に行ったことをそのワークフローに貼り付けることができる場所を見つけるだけです(そして、クラスターがランダムなクラスターよりも少し良いことを願っています!)


あなたの答えは素晴らしいですね。データに効率的に使用できますか。それを試す時間を得ることができませんでした。
user2721

@david w:これは私が見た中で最高の答えの一つです!スタンドアロンの例を投稿していただき、ありがとうございます。少なくとも、私はあなたの答えの核心を理解しています:)もう一度ありがとう!
伝説

@david w:私が持っていた唯一の質問は、エルボ法が値の増加を示し、プロットが減少を示していることです。これは、kmeansから直接歪み値を使用しているためですか?これをWikipediaのエルボープロットのように変換するにはどうすればよいですか?最後の質問として、kmeansではなくkmeans2に対してこれを行う方法を知っていますか?
伝説

最初のプロットを見ているだけで、インデックス3を発見しましたか?
シグル

2

おそらく、Fastmapのようなものを試して、相対的な距離を使用してマークのセットをプロットします。

(それでも) pythonでFastmapを作成して文字列をプロットする巧妙なものなく、独自の距離メトリックを作成すると、属性のリストを処理するように簡単に更新できます。

以下は、私が使用する標準のユークリッド距離であり、パラメータとして2つの属性リストを取ります。リストにクラス値がある場合は、距離の計算に使用しないでください。

def distance(vecone, vectwo, d=0.0):
    for i in range(len(vecone)):
        if isnumeric(vecone[i]):
            d = d + (vecone[i] - vectwo[i])**2
        elif vecone[i] is not vectwo[i]:
            d += 1.0
    return math.sqrt(d)

def isnumeric(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

0

私はpythonの専門家ではありませんが、最初の2つの主成分をx、y軸上で相互にプロットすると非常に役立ちます。

どのパッケージを使用しているかはわかりませんが、サンプルリンクは次のとおりです。

http://pyrorobotics.org/?page=PyroModuleAnalysis


私は統計の専門家ではありません。プロットのアイデアについて詳しく説明していただけますか?
-user2721

基本的な考え方は、多くの変数が互いに相関しており、すべてを相互に相関せず、データの変動の「ほとんど」を説明する2つの変数のみに減らすことができるということです。主成分分析を読んで、それを実装できるパッケージを適用する必要があります。 en.wikipedia.org/wiki/Principal_component_analysis
ラルフウィンターズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.