あたらしい数理最適化を無料で試す
あたらしい数理最適化という本を買って,最適化を勉強しようと思ったら
Gurobiという商用のソルバを使っていて,割と無料トライアルの申請もめんどそうだったのでがっかりしていたのですが
mypulp というのがあって同じコードが動くっぽかったのでそっちを使えばいいよというだけの話です.
pip install mypulp でおけ
#線形最適化 from mypulp import * model = Model("lo1") x1 = model.addVar(name="x1") x2 = model.addVar(name="x2") x3 = model.addVar(ub=30.0, name="x3") model.update() model.addConstr(2*x1 + x2 + x3 <= 60) model.addConstr(x1 + 2*x2 + x3 <= 60) model.setObjective(15*x1 + 18*x2 + 30*x3, GRB.MAXIMIZE) model.optimize() print("Opt. Value = ", model.ObjVal) for v in model.getVars(): print(v.VarName, v.X) #結果 #Opt. Value = 1230.0 #x1 10.0 #x2 10.0 #x3 30.0
プログラミングHaskell1-3章を読破
プログラミングHaskellを勉強中
3章の練習問題をやってみる(関数の:typeを調べるときは,先にlet で定義してやるべし)
注に書いてあるように,double, とかpalindromeとかはクラス制約がきちんと書かれている
--1.の答え Prelude> :type ['a', 'b', 'c'] ['a', 'b', 'c'] :: [Char] Prelude> :type ('a', 'b', 'c') ('a', 'b', 'c') :: (Char, Char, Char) Prelude> :type [(False, '0'), (True, '1')] [(False, '0'), (True, '1')] :: [(Bool, Char)] Prelude> :type ([False, True], ['0', '1']) ([False, True], ['0', '1']) :: ([Bool], [Char]) Prelude> :type [tail, init, reverse] [tail, init, reverse] :: [[a] -> [a]] --2.の答え Prelude> let second xs = head (tail xs) Prelude> :type second second :: [a] -> a Prelude> let swap (x, y) = (y, x) Prelude> :type swap swap :: (t1, t) -> (t, t1) Prelude> let pair x y = (x, y) Prelude> :type pair pair :: t -> t1 -> (t, t1) Prelude> let double x = x * 2 Prelude> :type double double :: Num a => a -> a Prelude> let palindrome xs = reverse xs == xs Prelude> :type palindrome palindrome :: Eq a => [a] -> Bool Prelude> let twice f x = f (f x) Prelude> :type twice twice :: (t -> t) -> t -> t
3.は上のコード実行
4.はちょっとよくわからない.関数が全く同じものであることを示すには
すべての入力に対してすべての出力が同じにならなければいけないということ?
その場合内部のアルゴリズムの違いは気にしないでもよいのか?(クイックソートとバブルソートみたいな感じで)
なんにせよ,入力の範囲が有限でなければ一般に同一であることを確かめられないから無理そう.
入出力の対応を数学的に証明できる場合は同等といえるか...
python3でgihyoの機械学習はじめようのナイーブベイズをやる
gihyoのナイーブベイズはpython2.6なので、python3でやり直してみる。
とりあえず、python3環境を用意
beautifulsoupはanaconda だと元々入っているはず。。。
なければ
pip install beautifulsoup4
とする。
morphorogical.pyのimportを
import urllib
import urllib.parse
import urllib.request
from bs4 import BeautifulSoup
に変更。
urllibまわりの呼び出しを
sentence = sentence.encode("utf-8")
params = urllib.parse.urlencode({'appid':appid, 'results':results, 'filter':filter,'sentence':sentence}).encode('utf-8')
results = urllib.request.urlopen(pageurl, params)
に変更すればOK
あとは、maxintが廃止されたので
max = -sys.maxsizeに
classifierの
prob < maxは誤植だと思うので
prob > maxにする
print まわりは
words = 'ヴァンロッサム氏によって開発されました.'
print ('%s => 推定カテゴリ: %s' % (words ,nb.classifier(words)))
という感じに変更すれば、動きます。
お疲れ様でした。
あと、若干謎なのが、len(self.vacabularies)を足していることなんですよね。
prob = (self.incategory(word, cat) + 1.0) / (sum(self.wordcount[cat].values()) + len(self.vocabularies) * 1.0)
指定wordの数 / cat内の全単語数でいいと思うんですが...
macのpython3 opencv3 でcontrib(siftとかsurf)パッケージのインストール
macのpython3 opencv3環境でcontribパッケージを導入できたのでメモ
contribとはSIFTとかSURFとか研究では割と使うけど、特許の関係とか色々あるものを
分割した機能が入っているパッケージです。
anaconda環境に入れたけどvirtualenvでも一緒だと思う
とりあえず大変だった...
でcontribなしでは入れたけど、contribは入ってないため今回はcmakeでビルドして入れようと思う
とりあえずcmakeでビルドするのはここ
Install OpenCV 3 With Python 3 (Mac OSX) - Luis González
anaconda特有の問題(フラグの指定とかdlibの位置とかは)
osx - opencv 3.0.0 alpha with Python 3 failed to import cv2 - Stack Overflow
ここを参考に
とりあえず、新しく環境を作る
conda create -n py34cv3contrib python=3.4 anaconda
cmakeでビルドするので
GUI版のcmakeを入れておく
でopencv3は
zipで落とす
contrib本体は
GitHub - Itseez/opencv_contrib: Repository for OpenCV's extra modules
からクローンするなりzipで落とすなりする。
で以下の設定をするわけだが、GUIでやるのを強くお勧めします。
まずsourceにさっき落としたopencvフォルダを
で次にdstをopencvフォルダの下にbuildとか作ってそこを指定
でcontribはさっき落としたcontribのフォルダのパスを
OPENCV_EXTRA_MODULES_PATH=/さっきのcontribpath/modules
を指定。
他の設定を(多分抜けはないと思うのですが...)
CMAKE_INSTALL_PREFIX=/Users/hogehoge/anaconda/envs/py34cv3contrib
PYTHON3_EXECUTABLE=/Users/hogehoge/anaconda/envs/py34cv3contrib/bin/python3
PYTHON3_LIBRARY=/Users/admin/anaconda/envs/py34cv3contrib/lib/libpython3.4m.dylib
PYTHON3_INCLUDE_DIR=/Users/hogehoge/anaconda/envs/py34cv3contrib/include/python3.4m
PYTHON3_NUMPY_INCLUDE_DIRS=/Users/hogehoge/anaconda/envs/py34cv3contrib/lib/python3.4/site-packages/numpy/core/include
PYTHON3_PACKAGES_PATH=/Users/hogehoge/anaconda/envs/py34cv3contrib/lib/python3.4/site-packages
そしたら、generateとconfigureを押して完了したら
ターミナルでbuildフォルダに移動して
make -j4
終わったら
sudo make install
でpy34cv3contribの環境にがバーッとインスコされます。
あともう少し
最後に、cv2.soが参照するdylibの位置を教えてあげる必要があります。
自分が怒られたのはこの二つだけでした。
hogehogeは自分のユーザ名に変更してください
sudo install_name_tool -change libpython3.4m.dylib /Users/hogehoge/anaconda/envs/py34cv3contrib/lib/libpython3.4m.dylib /Users/hogehoge/anaconda/envs/py34cv3contrib/lib/python3.4/site-packages/cv2.so
sudo install_name_tool -change lib/libopencv_hdf.3.1.dylib /Users/hogehoge/anaconda/envs/py34cv3contrib/lib/libopencv_hdf.3.1.dylib /Users/hogehoge/anaconda/envs/py34cv3contrib/lib/python3.4/site-packages/cv2.so
done
これで、完了。お疲れさまです。
試しに、lennaさんを落としてきて、下のを実行してみてください。
import cv2
import numpy as np
from matplotlib import pyplot as plt
imgOrg = cv2.imread( './lenna.png' )
imgGray = cv2.cvtColor( imgOrg, cv2.COLOR_BGR2GRAY )
sift = cv2.xfeatures2d.SIFT_create( nfeatures = 0, nOctaveLayers = 3, contrastThreshold = 0.04, edgeThreshold = 10, sigma = 1.6 )
keypoints, descriptors = sift.detectAndCompute( imgGray, None )
imgDst = np.empty_like( imgOrg )
cv2.drawKeypoints( imgOrg, keypoints, imgDst, -1, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS )
cv2.imshow( 'hoge', imgDst )
cv2.waitKey( 0 )
cv2.destroyAllWindows()
こんな感じで特徴点が表示されればOKです。
ついにmac python3, opencv3でSIFTを使えるようになりました!!
誰かcontrib付きpipで入れられるようにしてくんねーかな
PySideをanacondaで使おうとしてハマったこと
pysideでhelloworldするまでに割と時間がかかったので手順をメモ
特にImage not found に悩まされた....
最初に
brew install cmake
brew install qt
をして
pip install PySideする
意気揚々とtutoriの↓を実行するも
import sys
from PySide.QtCore import *
from PySide.QtGui import *
# Create a Qt application
app = QApplication(sys.argv)
# Create a Label and show it
label = QLabel("Hello World")
label.show()
# Enter Qt application main loop
app.exec_()
sys.exit()
Library not loaded: @rpath/libpyside.cpython-34m.1.2.dylib
Referenced from: /Users/hogehoge/anaconda/envs/py34con/lib/python3.4/site-packages/PySide/QtCore.so
Reason: image not found
となる、QtCore.soのrpathの下にdylibがないと言っているので
rpathを追加してあげる。ないって言っているファイルがあるとこを探して
install_name_toolで追加、自分の場合は下の4つで動いた
install_name_tool -add_rpath /Users/hogehoge/anaconda/envs/py34con/lib/python3.4/site-packages/PySide QtGui.so
install_name_tool -add_rpath /Users/hogehoge/anaconda/envs/py34con/lib/python3.4/site-packages/PySide QtCore.so
install_name_tool -add_rpath /Users/hogehoge/anaconda/lib QtGui.so
install_name_tool -add_rpath /Users/hogehoge/anaconda/lib QtCore.so
python3 opencv3入門-ラベリング
さてさて、二値化、フィルタ、モフォロジーときたら次はラベリングですね。
二値化して、モフォロジーをかけたら、次は孤立領域ごとに分けたくなるというのが人情です。opencvにはconnectedComponentsという関数がありまして、これを二値画像に適応するといい感じに分離してくれます。
nLabelsにはいくつの孤立領域があるか、labelImageにはラベリング済みの画像が入ります。
import cv2
import numpy as np
import copy
import random
from matplotlib import pyplot as plt
img = cv2.imread('./images/test1.png', cv2.IMREAD_COLOR)#カラー画像としてよみ出し
height, width, channels = img.shape[:3]
dst = copy.copy(img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) #白対領域となるのでINVを指定
nLabels, labelImage = cv2.connectedComponents(binary)
colors =
for i in range(1, nLabels + 1):
colors.append(np.array([random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)]))
for y in range(0, height):
for x in range(0, width):
if labelImage[y, x] > 0:
dst[y, x] = colors[labelImage[y, x]]
else:
dst[y, x] = [0, 0, 0]
print(nLabels)
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.xticks(), plt.yticks()
plt.subplot(122), plt.imshow(dst, 'gray'), plt.title('LABEL')
plt.xticks(), plt.yticks([])
plt.show()
孤立領域ごとに明るさが違うのがわかりますでしょうか。
コードはここを参考にしました
[OpenCV Python]OpenCVを使ったラベリング · atinfinity/lab Wiki · GitHub