Loading web-font TeX/Main/Bold

July 20, 2012

Excelの散布図のデータにラベルをつける

Excel for Mac 2011ではマクロが使えます.散布図にラベルを追加してみます.参考にしたのは以下のサイトです.

Excelでマクロを使用して散布図またはバブルチャートのデータポイントにラベルを追加する方法 http://support.microsoft.com/kb/213750/ja

以下の各食材100gあたりの栄養価のデータを散布図にします.横軸にカロリー(kCal),縦軸にタンパク質(g)を示します.

ラベル カロリー タンパク質
トマト 18 0.88
バナナ 89 1.09
ミカン 53 0.81
リンゴ 48 0.27
キュウリ 16 0.65
view raw data hosted with ❤ by GitHub


データをシートに記入したら散布図の挿入


こんなかんじでグラフが作成されます.タイトルは消した!


ツール > マクロ > Visual Basic Editorを起動


プロジェクトエクスプローラーで該当のシートを右クリックして標準モジュールを追加


以下のコードを記入

Sub AttachLabelsToPoints()
'Dimension variables.
Dim RCounter As Integer, CCounter As Integer, xVals As String
'Disable screen updating while the subroutine is run.
Application.ScreenUpdating = False
'Store the formula for the first series in "xVals".
xVals = ActiveChart.SeriesCollection(1).Formula
'Extract the range for the data from xVals.
xVals = Mid(xVals, InStr(InStr(xVals, ","), xVals, _
Mid(Left(xVals, InStr(xVals, "!") - 1), 9)))
xVals = Left(xVals, InStr(InStr(xVals, "!"), xVals, ",") - 1)
Do While Left(xVals, 1) = ","
xVals = Mid(xVals, 2)
Loop
'Attach a label to each data point in the chart.
For RCounter = 1 To Range(xVals).Cells.Count
For CCounter = 1 To ActiveChart.SeriesCollection.Count
ActiveChart.SeriesCollection(CCounter).Points(RCounter).HasDataLabel = _
True
ActiveChart.SeriesCollection(CCounter).Points(RCounter).DataLabel.Text = _
Range(xVals).Cells(RCounter, 1).Offset(0, -1).Value
Next CCounter
Next RCounter
End Sub


ラベルを追加するグラフを選択して実行
Excelに戻ってツール → マクロ → マクロからも実行できます


でこんな感じ
X軸,y軸にラベル貼りゃよかった


参考にしたサイトのものではデータが2列以上あると追加されないのですが,上のコードなら大丈夫,のはず.いろいろいじればいろいろいじれます.コードはWindowsでも使えると思う.

koboで無料作品を探す

追記

http://rakuten.kobobooks.comに「無料で読める本」というメニューが追加されてました
もっとよくなっていけばうれしい

追記終わり


http://rakuten.kobobooks.comにアクセス



ログインして空欄にしたまま検索(読みたい作品があるなら空欄じゃなくてもいい)



日本語の作品だけ探すなら「日本語」で絞る



検索結果から無料作品のみ表示を選択



ライブラリに追加



本体をUSBでつないでkoboデスクトップ http://rakuten.kobosetup.com/ で同期




無料作品いっぱいあって全体を見るのは大変
結構遅いもんで本体から探すのだるい
あとWi-Fi全然つながんないんだけどどういうこと














July 4, 2012

Pythonでラベル伝搬法を試してみる

ネットワークの構造を予測解析のタスクにはノード判別とリンク予測があります.ノード判別問題は,幾つかのノードについてクラスラベルが与えられているとき,残りのクラスラベルが未知のノードに対してクラスラベルを予測する問題です.

ノード判別手法の最も簡単なもののひとつとしてラベル伝搬法という手法が知られています.ラベル伝搬法のアルゴリズムのひとつを文献1の801ページに基づいて実装してみました.なおラベル伝搬法については文献2の11章にまとまってました.

  1. 鹿島, グラフとネットワークの構造データマイニング, 電子情報通信学会誌 93(9), 797-802, 2010.
  2. Chapelle, O. et al., Semi-supervised learning, MIT Press, 2006.


ラベル伝搬法は「ネットワーク上で隣り合ったノードは同じクラスに属する」と仮定して未知のノードにラベルを振る半教師あり学習の手法.ここでは +1 と -1 の2種類のクラス判別問題.

  • ネットワークの構造は{\bf W}で表す.{\bf W}i,j成分はi番目のノードとj番目のノードにリンクがある(1)か,ない(0)か.
  • クラスラベルはベクトル{\bf y}で表す.ふられてないときは0.
  • 予測値はベクトル{\bf f}で表す.それぞれ[-1,1]の連続値.

で隣り合ったノードの予測値が互いに近くなるように決定するための目的関数は以下.

\begin{align} J({\bf f})&=\sum_{i=1}^l(y^{(i)}-f^{(i)})^2 + \lambda \sum_{i<j}y^{(i,j)}(f^{(i)}-f^{(j)})^2 \\ &=||{\bf y}-{\bf f}||_2^2+\lambda {\bf f}^T{\bf L}{\bf f} \end{align}

ただし{\bf L}\equiv {\bf D}-{\bf W}{\bf D}{\bf W}の各行の和を対角成分に持つ行列.λは1項目と2項目のバランスを取る定数.1項目は正解に近づけ,2項目は隣合うのノードの予測値を近づけます.

で,この最小化問題の解が

({\bf I}+\lambda {\bf L}){\bf f}={\bf y}

の解として求められます.


以下,てけとーにノードクラスとリンクを決めて試してみました.要scipy.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from scipy.sparse import dok_matrix, dia_matrix, identity
from scipy.sparse.linalg import spsolve
# ネットワークの構造
# ノードiとノードjの間にリンクがあるときW[i,j]=1
W = dok_matrix((10,10))
W[0,2] = W[2,0] = 1
W[0,4] = W[4,0] = 1
W[0,9] = W[9,0] = 1
W[1,2] = W[2,1] = 1
W[2,3] = W[3,2] = 1
W[3,4] = W[4,3] = 1
W[3,6] = W[6,3] = 1
W[5,9] = W[9,5] = 1
W[6,7] = W[7,6] = 1
W[6,8] = W[8,6] = 1
W[7,9] = W[9,7] = 1
# クラスラベル
# 与えられていないときは0
y = dok_matrix([[1, 0, 1, 0, 1, -1, -1, -1, 0, 0]])
# DはWの各行(もしくは列)の和を対角成分に持つ行列
D = dia_matrix((W.sum(0),[0]), (10,10))
# ラプラシアン行列
L = D - W
# 単位行列
I = identity(10)
# lamb>0は2つの項のバランスを取る定数
lamb = 1
# 連立方程式の解を求める
#[ 0.45966011 0.23023256 0.46046512 0.1519678 0.5372093 -0.57951699
# -0.38980322 -0.51627907 -0.19490161 -0.15903399]
f = spsolve((I + lamb * L), y)



以下,結果をD3.jsで可視化しました.

予測前

ブルーとグリーンが予めクラスを与えているノード.オレンジのノードのクラスを予測します.

予測後

λ=1の結果です.node1とnode3はブルー,node8とnode9はグリーンに分けられました.ノードの色の濃さ(白か黒か)でどっちに近いか示しています.