パンナの学生生活

地方大学の大学生/プログラミング言語【python】を中心に紹介しています。/日々の脳内をアウトプット/麻雀とワインと日本酒が好き/将来は幸せになりたい

ooencv3の特徴量マッチングも紹介

皆さんopencv3は知っていますか。opencv3は画像処理や特徴量マッチングや顔認証などのライブラリーがたくさん入っているものです。

Opencv3とは

先ほども紹介したopencvは様々なアプリにも使われており、こちらからインストールするとpythonc++などでも使うことが可能です。また、opencvのインストールしたディレクトリにはサンプルが入っており、お試しに使用することが出来ます。

OpenCV

今日はその中の画像の特徴点抽出を紹介していきます。

f:id:panNakotta:20191126150648p:plain

特徴点抽出

こんな感じで二つの画像を比較して、特徴を抽出しています。また、この動画を比較して特徴点を抽出するpythonファイルもサンプルの中に存在しています。

これもアプリなどで使うこともできます。

サンプルコード

#!/usr/bin/env python ''' Affine invariant feature-based image matching sample. This sample is similar to find_obj.py, but uses the affine transformation space sampling technique, called ASIFT [1]. While the original implementation is based on SIFT, you can try to use SURF or ORB detectors instead. Homography RANSAC is used to reject outliers. Threading is used for faster affine sampling. [1] http://www.ipol.im/pub/algo/my_affine_sift/ USAGE asift.py [--feature=<sift|surf|orb|brisk>[-flann]] [ <image1> <image2> ] --feature - Feature to use. Can be sift, surf, orb or brisk. Append '-flann' to feature name to use Flann-based matcher instead bruteforce. Press left mouse button on a feature point to see its matching point. ''' # Python 2/3 compatibility from __future__ import print_function import numpy as np import cv2 as cv # built-in modules import itertools as it from multiprocessing.pool import ThreadPool # local modules from common import Timer from find_obj import init_feature, filter_matches, explore_match def affine_skew(tilt, phi, img, mask=None): ''' affine_skew(tilt, phi, img, mask=None) -> skew_img, skew_mask, Ai Ai - is an affine transform matrix from skew_img to img ''' h, w = img.shape[:2] if mask is None: mask = np.zeros*1 A = np.hstack([A, [[-x], [-y]]]) img = cv.warpAffine(img, A, (w, h), flags=cv.INTER_LINEAR, borderMode=cv.BORDER_REPLICATE) if tilt != 1.0: s = 0.8*np.sqrt(tilt*tilt-1) img = cv.GaussianBlur(img, (0, 0), sigmaX=s, sigmaY=0.01) img = cv.resize(img, (0, 0), fx=1.0/tilt, fy=1.0, interpolation=cv.INTER_NEAREST) A[0] /= tilt if phi != 0.0 or tilt != 1.0: h, w = img.shape[:2] mask = cv.warpAffine(mask, A, (w, h), flags=cv.INTER_NEAREST) Ai = cv.invertAffineTransform(A) return img, mask, Ai def affine_detect(detector, img, mask=None, pool=None): ''' affine_detect(detector, img, mask=None, pool=None) -> keypoints, descrs Apply a set of affine transformations to the image, detect keypoints and reproject them into initial image coordinates. See http://www.ipol.im/pub/algo/my_affine_sift/ for the details. ThreadPool object may be passed to speedup the computation. ''' params = [(1.0, 0.0)] for t in 2**(0.5*np.arange(1,6)): for phi in np.arange(0, 180, 72.0 / t): params.append*2 def f(p): t, phi = p timg, tmask, Ai = affine_skew(t, phi, img) keypoints, descrs = detector.detectAndCompute(timg, tmask) for kp in keypoints: x, y = kp.pt kp.pt = tuple( np.dot(Ai, (x, y, 1)) ) if descrs is None: descrs = return keypoints, descrs keypoints, descrs = , [] if pool is None: ires = it.imap(f, params) else: ires = pool.imap(f, params) for i, (k, d) in enumerate(ires): print('affine sampling: %d / %d\r' % (i+1, len(params)), end='') keypoints.extend(k) descrs.extend(d) print() return keypoints, np.array(descrs) if __name__ == '__main__': print(__doc__) import sys, getopt opts, args = getopt.getopt(sys.argv[1:], '', ['feature=']) opts = dict(opts) feature_name = opts.get('--feature', 'brisk-flann') try: fn1, fn2 = args except: fn1 = 'aero1.jpg' fn2 = 'aero3.jpg' img1 = cv.imread(cv.samples.findFile(fn1), cv.IMREAD_GRAYSCALE) img2 = cv.imread(cv.samples.findFile(fn2), cv.IMREAD_GRAYSCALE) detector, matcher = init_feature(feature_name) if img1 is None: print('Failed to load fn1:', fn1) sys.exit(1) if img2 is None: print('Failed to load fn2:', fn2) sys.exit(1) if detector is None: print('unknown feature:', feature_name) sys.exit(1) print('using', feature_name) pool=ThreadPool(processes = cv.getNumberOfCPUs()) kp1, desc1 = affine_detect(detector, img1, pool=pool) kp2, desc2 = affine_detect(detector, img2, pool=pool) print('img1 - %d features, img2 - %d features' % (len(kp1), len(kp2))) def match_and_draw(win): with Timer('matching'): raw_matches = matcher.knnMatch(desc1, trainDescriptors = desc2, k = 2) #2 p1, p2, kp_pairs = filter_matches(kp1, kp2, raw_matches) if len(p1) >= 4: H, status = cv.findHomography(p1, p2, cv.RANSAC, 5.0) print('%d / %d inliers/matched' % (np.sum(status), len(status))) # do not draw outliers (there will be a lot of them) kp_pairs = [kpp for kpp, flag in zip(kp_pairs, status) if flag] else: H, status = None, None print('%d matches found, not enough for homography estimation' % len(p1)) explore_match(win, img1, img2, kp_pairs, None, H) match_and_draw('affine find_obj') cv.waitKey() cv.destroyAllWindows()

このようなコードになっています。

しかしこのコードもしっかりと関数化されて書かれていて、再利用可能なサンプルコードになっているので画像を変えても使えます。

私も昔、サンプルコードを使って別の画像で比較してみたこともあります。

 

pannakotta.hatenablog.jp

 

また、Opencvでは画像のモザイク処理や色を反転させることや、ぼかし等もできます。

なので他のサンプルコードを使うことで

機械学習のtrain画像のかさ増しもopencvを使ってすることが出来ます。

*1:h, w), np.uint8) mask[:] = 255 A = np.float32([[1, 0, 0], [0, 1, 0]]) if phi != 0.0: phi = np.deg2rad(phi) s, c = np.sin(phi), np.cos(phi) A = np.float32([[c,-s], [ s, c]]) corners = [[0, 0], [w, 0], [w, h], [0, h]] tcorners = np.int32( np.dot(corners, A.T) ) x, y, w, h = cv.boundingRect(tcorners.reshape(1,-1,2

*2:t, phi

二分探索木 アルゴリズムを実装してみる【python】

今日は、二分探索木のアルゴリズムについて扱っていきます。二分探索木の基本的な考えは、Atcoderでも二分探索木の考えも出てきているのでアウトプットのために書きました。今日は二分探索木を参考書などで調べたので、何か間違えていたら教えてください。

 二分探索木

ソースコード

配列内の数を二分探索木で調べる

二分探索木

二分探索木(二分探索木)とは「左の子孫の値<=親の値<=右の子孫の値」という制約を持つ二分木である。

ja.wikipedia.org

二分探索方の実行時間はO(logn)となっている。また二分探索法は配列がソートされている場合に使用することが大半です。なのでソート時間は含まれていません。

また、これから扱うコード内の配列もソートされている配列前提で話しています。

 

扱うコード

x=[1,2,5,7,3,6,34,43,54,34,45,76]
l=sorted(x)
search=54
left=0
right=len(x)
t=(right+left)//2
while left<=right:
  if search == l[t]:
     break
  elif search > l[t]:
    left=t
  elif search < l[t]:
    right=t
  t=(left+right)//2
if search == l[t]:
  print("配列内の{}番目です".format(t+1))
else:
  print("配列内にありません")

このコードは配列x内の数(search=54)が配列内の何番目に位置しているかを知れべるコードです。実際はfor文を使うことでも同じようにできますが、atcoderなどではfor文の探索でも10^7で大体実行時間がオーバーしてしまいますが、二分探索木では10^30までは可能です。なのでデータ数が多い場合は二分探索木が有効なのです。

実行結果

f:id:panNakotta:20191125233309p:plain

こんな感じになりました。

また、10^7でfor文での探査と二分探索木の実行時間を比較してみました

f:id:panNakotta:20191125233707p:plain

二分探索木

これが二分探索木での実行時間です。

f:id:panNakotta:20191125233752p:plain

for

こちらがfor文の実行時間です。

データ数が多いと実行時間に差が出てきますね

 

何か質問や間違った内容がありましたら教えてください

プログラミング【python】で作る。前に流行ったtweetからwordcloud を作る方法

今回の記事はpython/APIツイッターの内容を取得して、それをwordcloudで表示するソースコードを紹介していきたいと思います。

昔はよく流行りましたね。word Cloud

TwitterAPIについて

word cloudについて

MeCabについて

ソースコード

 TwitterAPIについて

みなさんTwitterAPIは知っていますか??TwitterAPIとはツイートやタイムラインをWEBサイトを経由しなくても取得できる方法です。pythonコードからツイート内容を取得できるわけです。

TwitterAPIのアカウント取得方法はこちらから

Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2019年8月時点の情報 - Qiita

このアカウントを取得したのちにTwitterAPIつかってツイートやタイムラインを取得できるんです。そこでツイートの分析などもできます。

word cloudについて

word cloudはひと昔前にすごく流行って一時期はツイッターのタイムラインを占領していました。今はめったに見かけないけれども、、、

 githubからのオープンソースはこちら

github.com

ライセンスのこちらから

word_cloud/LICENSE at master · amueller/word_cloud · GitHub

word cloudのインストール方法はWindowsならpipインストールでできるはずです。昔やったので忘れました。ごめんなさい。。

でもインストールしただけでは日本語対応していないんです。英語表示ならできるのですが、なので必要なのがmecabです。

MeCabについて

mecabとは形態素解析ツールです。日本語の文章を単語で区切ったり、名詞や助詞などに区切ったりできるのです。

MeCab: Yet Another Part-of-Speech and Morphological Analyzer

ここにインストール方法も書かれています。

ソースをダウンロードして自分のPCに解凍をしてmecabを使用することが可能です。自分の場合Windowsを使っているのですが、インストールしてもできず、Visual Studio C++をインストールするとできました。

ソースコード

import tweepy
import datetime
import time
import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import MeCab
consumer_key = "xxxxxxxxxxxxxxxxxxxxxx"
consumer_secret = "xxxxxxxxxxxxxxxxxxxxx"
access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
access_token_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth ,wait_on_rate_limit = True)

name="name"
userID="Twitter ID"
date=datetime.date.today()
tweets_data=[]

def get_tweets(api,userID,dfile):
    date=datetime.date.today()
    page=1
    deadend=False
    while True:
        tweets=api.user_timeline(userID,page=page)
        for tweet in tweets:
            if (datetime.datetime.now()-tweet.created_at).days <1:
                print(date)
                print (tweet.text.encode('utf-8').decode('utf-8'))
                tweets_data.append(tweet.text.encode('utf-8').decode('utf-8') + '\n')
                fname = r"'"+ dfile +".txt" + "'"
                fname = fname.replace("'","")

                with open(fname, "w",encoding="utf-8") as f:
                    f.writelines(tweets_data)
            else:
                deadend=True
                return
            if not deadend:
                page+=1
                time.sleep(500)
print('******Enter file name******')
dfile = input('>  ')
get_tweets(api, userID, dfile)
def analyze_tweet(dfile):
    fname = r"'"+ dfile +".txt" + "'"
    fname = fname.replace("'","")

        #Mecabを使用して、形態素解析
    mecab = MeCab.Tagger("-Ochasen")

        #"名詞", "動詞", "形容詞", "副詞"を格納するリスト
    words=[]

        #ファイルを読込み
    with open(fname, 'r',encoding="utf-8") as f:

        reader = f.readline()

        while reader:
                #Mecabで形態素解析を実施
            node = mecab.parseToNode(reader)

            while node:
                word_type = node.feature.split(",")[0]

                    #取得する単語は、"名詞", "動詞", "形容詞", "副詞","感動詞"
                if word_type in ["名詞", "動詞", "形容詞", "副詞","感動詞"]:

                    words.append(node.surface)

                node = node.next

            reader = f.readline()

    font_path = r"C:\WINDOWS\Fonts\HGRGE.TTC"

    txt = " ".join(words)

         # ストップワードの設定 ※これは検索キーワードによって除外したほうがいい単語を設定
    stop_words = [ 'です' ,'ました','いる','あり','ある','www','ww','そう','する'
        ,'すぎ','https','co','みたい']

        #解析した単語、ストップワードを設定、背景の色は黒にしてます
    wordcloud = WordCloud(background_color="white",font_path=font_path, stopwords=set(stop_words),
            width=800,height=600).generate(txt)

    pct =  r"'"+ dfile +".png" + "'"
    pct = pct.replace("'","")
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.savefig(pct,format='png',dpi=300)
    plt.show()


analyze_tweet(dfile)

 これでツイートを取得してwordcloudを作ることが可能です。

コード内のuserIDを変更することでそのIDのツイートを取得できます。

consumer_key = "xxxxxxxxxxxxxxxxxxxxxx"
consumer_secret = "xxxxxxxxxxxxxxxxxxxxx"
access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
access_token_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

 これは個人で取得したAPIのアカウントから設定可能です。

参考にしたサイト

Python Twitterからツイートを取得してテキスト分析(wordcloudで見える化) - Qiita

実行結果はこんな感じです。TwitterのDMでお願います。@panNakott25

なにか質問があれば私の

f:id:panNakotta:20191012201959p:plain

wordcloud

 

【python】Atcoderの過去問でpythonの基本を学ぶ。if文 .join()

今日はpythonの基本構文について紹介します。また今回はAtCoderの過去問を用いてやっていきたいと思います。

 この記事で扱うAtCoderの過去問

自分の回答

if文のブール演算子とその併用

.join()について

この記事で扱うAtCoderの過去問

今回はAtCoderのB問題の過去問を使っていきたいと思います。

atcoder.jp

目次に書いた通りこの内容を理解していれば解くことができます。

ちなみにふつうはB問題でfor文を使うことが多いのですがこの問題は使わなくても解くことができます。

if文の書き方やprint()がわからない人はこちらを見てみてください

 

pannakotta.hatenablog.jp

自分の回答

S=list(input())
a=[S[0],S[1]]
b=[S[2],S[3]]
c=int("".join(a))
d=int("".join(b))
if 0<c<13 and 0<d<13:
  print("AMBIGUOUS")
if 0<c<13 and (d<1 or 12<d):
  print("MMYY")
if (c<1 or 12<c) and 0<d<13:
  print("YYMM")
if (c<1 or 12<c) and (d<1 or 12<d):
  print("NA")

 

 このような解答をしました。またこの他の解答方法もたくさんあります。このコードよりきれいなコードもたくさんあります。なので他の人の解答も見てみることをお勧めしています。

if文のブール演算子とその併用

論理演算子には論理和論理積とnotがあります。今日はその解説をします。論理和は条件式に、”または(or)”を論理積は条件式に”かつ(and)”そして否定のnotがあります。

if A and B: #AかつBどちらも真であるとき
   ["条件式がTrueの時の処理"]

if A or B: #AまたはBが真であるとき
     ["条件式がTrueの時の処理"]

if not A #A出ないとき
  ["条件式がTrueの時の処理"]
*併用の仕方は上記の解答を参考にしてみてください。

.join()について

この.join()は実はAtCoderに便利です。配列を””なしで表示するときなどよく使います。なのでこの使い方を覚えておくとAtCoderでも困らないと思います。

s=list(input())
#入力 shdshdjew

print(s)
#出力['s', 'h', 'd', 's', 'h', 'd', 'j', 'e', 'w']

print("".join(s))
#出力 shdshdjew

print("*".join(s))
#出力 s*h*d*s*h*d*j*e*w

print(",".join(s))
#出力 s,h,d,s,h,d,j,e,w

 

 こんな感じで様々な出力をすることができます。自分のPCで手を動かしてやってみてください!!

今日はここまでにしておきましょう。

なんか質問があったらツイッターのDMで質問を募集しています。なにか力になれたらうれしいです。

ツイッターID:`panNakott25

 

【python】【Django】WEBサイト・アプリケーションを作る。第一話

今、はてなブログを作っているのですが、今後は自分で作ったWEBサイトで運営していきたいと思っています。なので【python】と【Django】を使って作っていこうと思います。これは記念すべき第一話ですね、、さて何か月かかるのでしょうか??

Djangoとは

環境開発について

進捗状況

Djangoとは

Django ドキュメント | Django ドキュメント | Django

pythonプログラミング言語でWEB開発のために設計された言語ではありませんがこれをWEB開発にも使えないか?ということでPython用のフレームワークとしてよく使われているのが【Django】です。ちなみに読み方は”じゃんご”です。僕は前までだじゃんごって呼んでました。こいつを使うとWEB開発が出来るわけなんですね。

環境開発について

Pythonを前々から使っているひとも自身のPCにanacondaをインストールしてPythonを使ている人が多いかと思います。WEB開発もanacondaを使うととてもやりやすいと感じました。そしてanacondaの中にあるspyderと呼ばれる開発環境をインストールします。spyderはeditorとしても使われるのでとても優秀です。

Anaconda | The World's Most Popular Data Science Platform

この下にanacondaのインストール方法を貼っておきます。

https://www.sejuku.net/blog/59340

ちなみにさっきまで使っていたのはこんな感じです。

f:id:panNakotta:20191008164256p:plain

spyder

こんな感じでWEB開発をするとディレクトリやファイルがとても多くなるのでspyderはとても使いやすいです。

進捗状況

今回は初めてDjangoを使ってWEBサイトをつくっていたのですがなかなか進まなかったですね。また、すごく前にHTMLの大体の書き方を独学したのですが意外と忘れていてびっくりしました。WEB開発にはHTMLとCSSは欠かせませんからね、、、、

今日はここまで作っていました。

f:id:panNakotta:20191008164821p:plain

こうみてみるとWEBサイトの背景は黒じゃない方がいいかもしれませんね。少し見にくいし、怖いですね。。。

WEBサイトのセンス皆無

泣いたぁ~~~(唐突なJK感)

全然まだ出来上がっていないのであと何か月かかるんですかね。。

ちなみに自分も分からないけど独自のドメインってどうやって入手するのかわからないんですよね。。多分購入するのかレンタルするのか、、いろいろ調べてみますね。

 

今回はこんな報告っていう感じですがWEBサイトが出来てきたらコードをのせていきたいと思います。

 

ではまた第二話をお待ちを~

クズ大学生の考え【時間を無駄にしたい人は見てください】

 

今回は目次もなんも付けないで適当に綴っていきたいです。。。

いつもはプログラミングの話とかしているんですけど、今日はいつもと違った話をしていきます。

 

大学に入って「お金持ちになりてぇっ」て、思いながらいろいろ勉強してこれから役に立ちそうなプログラミングとか機械学習とかに興味を持ってもう何年もたった。

 

このWEBサイトも前の記事で行ってたように金を稼せぎたいと思って始めたわけなんですけど、、なかなか芽が出ない訳なんですよね、、そんなすぐには稼げるわけでもないんですけど

 

まぁお金持ちと言っても年収1000万くらいほしいなぁって感じなんですよね。

どうやったらブログで稼げるか考えながら大学で勉強してるわけなんです。

 

で、今思っているのがヒモになりたいなあと思っている今日この頃

 

ヒモってどうやったらなれるのだろうか、イケメンというわけでもないし、何か他の人より突出しているものもないから、、

 

そんなこんなを考えながら生きている(割と真剣に)

 

一回医学部キャンパスの前で「拾ってください」みたいなものをもって行こうまでも考えたことがある(狂気じみている)

 

やっぱヒモになるなら女医なのかなぁ、

 

【急募】ヒモになるには????

そんなこんなでいろいろ考えているけどヒモになった場合は専業主夫として徹底したい。。。だから料理だけはしなきゃ、今の時代料理系男子はモテるのか??

 

今日はこんな感じでなにも気にせず書きたいことをだらだら書いているんだけど、なかなか文字数が書けないもんなんですね、、いつもプログラミングの記事を書いているとコードのコピペするとすぐに2000文字とか行くんですけどね

*ちなみに今は650文字くらい

 

話が逸れている!!!!

 

で結論はヒモになりたい!!そんなことを公言しているけど実は働きたくない訳ではないんですよね、、唐突な告白!

 お金に困らない生活で結婚したいっていうのが本当の望みかもしれませんね。。

 

ほんとにクズ大学生ならこんなことまで考えないか、、

 

明日からまたプログラミングの話などその他もろもろ書いていきたいと思います。

よろしくお願いします。。

 

Akaike's Information Criterion: AICの実装【python】【データ分析】

今日扱うのは  赤池の情報量規準(Akaike's Information Criterion: AIC)です。最近データサイエンスなどでAICを耳にする方も多いと思います。図書館にもAICについての本が出ていました。これをPythonで実装するのを紹介したいです。

 1.AICとは

2.Pythonコードと説明

3.実行結果について

4.最後に

AICとは

 

尤度とAIC

AICとは

$ n$ 次回帰モデルの最尤法の結果について改めて考えてみると, ある問題点に気が付く. それは次数が大きいほど残差平方和は小さくなることである. つまり,残差平方和が小さいことが正義だとすると,次数を 大きくとることが正しいモデル選択の方法になってしまう. 極論を言うと $ n$ 組のデータを用いて $ n$ 次回帰モデルを 作ることが一番よいモデルであるということになる. しかし,この考え方はどうみてもおかしい. 赤池の情報量規準(Akaike's Information Criterion: AIC)は, このような問題点を回避するためのものさしとなるものである.

 今回はこれを用いて実際のデータではないが、データ似合う最適の次数で表された関数をグラフ化し、関数を求めるコードを作りました。

Pythonこのコードに使われているAICとLSMはこのサイトを参考にしました。

import numpy as np
import scipy as sp
from scipy import integrate
import math
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import pyplot
from numpy.linalg import pinv

import AIC
import LSM

x=[1,2,2,3,3,4,5,6,7,12,13,15,15,18,20,21,24,27]
y=[3,3,5,12,6,4,8,13,16,19,22,19,11,7,3,9,14,19]
x1 = np.array(x)
y1=np.array(y)

plt.plot(x,y,'o')
num=5

data = np.array([x1,y1]).T

data_x=[]
data_y=[]
for i in data :
    data_x.append(i[0])
    data_y.append(i[1])

# データをプロット

for k in range(0,num):
    N = k
AIC_com=[]

for n in range(N+1):
    # 実行する次数
    print("N="+str(n))

    # LSMで誤差と重みベクトルcoeを計算
    error, coe = LSM.LSM(data, int(n+1))
    print("error:"+str(error))
    print("coe:"+str(coe[::-1]))

    # ここで,このモデルのAICを計算
    l = AIC.l_MAX(list(coe[::-1]),data_x,data_y)
    AIC_n = AIC.AIC(l,n+1)
    print("l="+str(l)+", AIC("+str(n)+")="+str(AIC_n))
    AIC_com.append(AIC_n)



Minimum = np.min(AIC_com)
for m in range(0,num):
    if AIC_com[m] == Minimum:
        print('AIC最小の次数は:{}次'.format(m))
        s = m
        print("N="+str(s))

    # LSMで誤差と重みベクトルcoeを計算
error, coe = LSM.LSM(data, int(s+1))
print("error:"+str(error))
print("coe:"+str(coe[::-1]))

    # ここで,このモデルのAICを計算
l = AIC.l_MAX(list(coe[::-1]),data_x,data_y)
AIC_s = AIC.AIC(l,s+1)
print("l="+str(l)+", AIC("+str(s)+")="+str(AIC_s))
AIC_com.append(AIC_s)
print(np.poly1d(coe))
    # LSMで得た近似線をプロット
test_3 = np.arange(min(data_x), max(data_x), 0.01)
plt.plot(test_3, LSM.quation_LSM(coe, test_3),color='black',label="Harp seal ($Pagophilus$ $groenlandicus$)" )

plt.title("AIC")
plt.xlabel('x value')
plt.xlim(0,30)
plt.ylim(0,30)
plt.show()

GitHub - ustato/CalcAIC: モデル評価指標であるAIC(Akaike's Information Criterion)の計算をPythonで実装した.

このサイトのplot_TestAIC.pyは具体的な次数を設定して値を出している。これは、最大次数を設定して、その次数までのAICの値を求めて最小のAICの数値の次数のグラフを表示するプログラムである。

今回のx,yのデータは適当なデータなので参考にはならないデータです。

このプログラム内のnumが設定した最高次数です。その次数までをfor文で回し、AICを計算し、AICが最小な次数を求めています。そしてその次数の近似線をプロットしています。

実行結果について

このプログラムの実行結果がこちら

f:id:panNakotta:20191004114038p:plain

AICによって求められた近似線

大体こんな感じの近似線になりました。実はx,yのデータは三次関数っぽくなればうれしいなと思って作ってたので少しうれしかったです。(多分データ分析の点からは良くない)

f:id:panNakotta:20191004114650p:plain

こんな感じで最小の次数を出しています。

またnp.poly1dを使ってその3次関数を表示させています。

最後に

AICとLSMのモジュールファイルとこのプログラムは同じディレクトリに入れないとエラーが出てしまいます。

またこのサイトのデータを入れてみて正確かどうかも確認することが可能です。

尤度とAIC

何かこの記事に対して質問や意見があればツイッターに連絡ください

 @panNaKott25

matplotlibでグラフ上に画像を張り付ける方法【python】

今日はプログラミングの話をします。【Python】【AnnotationBbox】今回の内容は、グラフ上に画像を張り付ける方法について説明します。この手の方法も調べるてもあんまり出ない方法ですので参考になればと思っています。

 1.画像付きグラフの作成について

2.Pythonコード

3.AnnotationBboxについて

4.最後に

画像付きグラフの作成について

私が研究補助をしていた時に研究データのグラフに画像を挿入してほしいという要望をいただき付けようとしたのですが、なかなか参考となる日本語の記事が見つからなかったので今回はめっちゃ簡単なコードで分かりやすく説明していきたいです。

今回のグラフと画像に関しては関係ないです。

イメージはこんな感じです。

f:id:panNakotta:20191003130433p:plain

画像付きグラフ

矢印は不要な場合は消すことが出来ます。なぜSinグラフに花火の写真を張り付けたかはマジで適当です。あとで説明を加えたいのですが、画像の位置や矢印の指す位置はAnnotationBboxの引数で変えることが可能です。

Pythonコード

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import pyplot
from matplotlib.offsetbox import OffsetImage, AnnotationBbox

x=np.arange(-10,10,0.01)
y=np.sin(x)
plt.xlim(-10,10)
plt.ylim(-2,2)

#以降が画像を張り付ける方法
ax = plt.gca()
img = plt.imread("IMG_3469.jpg")
imagebox = OffsetImage(img, zoom=0.02)
ab = AnnotationBbox(imagebox, (7.37,0.8),
                        xybox=(7.5,-1.5),
                        xycoords='data'
                        ,arrowprops=dict(arrowstyle="->"),pad=0.5,frameon=False)
ax.add_artist(ab)
ax.plot(x,y)
figsize=(16,9)
plt.savefig("sample.png",format='png',dpi=300)
plt.show()

AnnotationBboxについて

AnnotationBboxi(imagebox,(x座標,y座標),xybox=(x座標,y座標),xycoords='data',arrowprops=dict(arrowstyle='->'),pad=0.5,frameon=False)

と表記してますが、imageboxは挿入する画像のことです。AnnotationBboxの前にplt.read('画像名')で読み込み、offsetImageで読み込んだ画像の縮尺を変えることが出来ます。

 

AnnotationBbox内の二番目の引数(x,y)は矢印の指す座標を示しています。矢印をなくした場合はこの座標は関係ないのですが消してしまうとエラー表示されたはずですので注意してください。

xyboxの座標は画像の真ん中の位置のことを表します。arrowprops=dict()は矢印の種類を変えることが出来ます。これは矢印がいらない場合は消してください。消してもエラーは吐かないです。

最後のframeonで画像の枠ぶちの有無を変えることが出来ます。

少し遊ぶとこんなこともできます。

f:id:panNakotta:20191003142344p:plain

for文を使用

このコードは以下になります。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import pyplot
from matplotlib.offsetbox import OffsetImage, AnnotationBbox

x=np.arange(-10,10,0.01)
y=np.sin(x)
plt.xlim(-10,10)
plt.ylim(-2,2)

img = plt.imread("IMG_3469.jpg")
imagebox = OffsetImage(img, zoom=0.02)
for i in range(-5,5,1):
    ab = AnnotationBbox(imagebox,(0,0),
                        xybox=(2*i,i*0.5),
                        xycoords='data'
                        ,pad=0.5,frameon=False)
    ax = plt.gca()
    ax.add_artist(ab)
ax.plot(x,y)
figsize=(16,9)
plt.savefig("sample.png",format='png',dpi=300)
plt.show()

最後に

他にも画像を張る方法はありますが今日説明した方法が無難な気がします。この方法をやってみて質問があればtwitterで質問をお願いします。また、このコンテンツはプログラミングの様々な情報を発信していくのでフォローをお願いします。

@panNakott25(ツイッター)

 

楽して稼げる仕事なんてねえ

ブログで稼げば就職しなくてい!!就職したくねえ!!んなこと思ってブログを初めて見た。よくツイッターとかSNSをやってるとブログで今月10万円稼ぎました。とか年収1,000万行きましたとかを目にして稼げたらラッキーみたいな軽い気持ちで始めて見て月日が経過した。

 

 1.自分の収益について

2.ブログで稼いでる人はすげえ話

3.今後について

自分の収益について

実際自分の収益はゼロですね。ブログってどうやって稼げるか知っていますか?

一つは広告の収益ですね。

 
    1. クリック報酬型 … クリック数に応じてお金がもらえる
    2. 成果報酬型 …一定の成果(商品購入・サービス申し込み)に達するとお金がもらえる

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwiRjbLztfrkAhUcwosBHfmQBa0QFjAAegQIABAB&url=https%3A%2F%2Fwww.google.com%2Fadsense%2Flogin%2Fja%2F&usg=AOvVaw15hTs2B7ppSItkq_7wkuDO となっていて有名なところだとgoogleアドセンスが有名ですね。 他にはASPで稼ぐ方法があります。ASPはよくアフィリエイトと呼ばれています。有名なものだとAmazonアソシエイト楽天アフィリエイトがあります。このAmazonアソシエイトの登録申請にもAmazon側から認めてもらわなくてはなりません。その条件は豊富なコンテンツや月間のPV数などが重要になってきます。ざっくり説明するとよく見られるブログは収益が見いだせやすいということです。自分の場合は、まだまだPV数も少なく月間100PVいくかいかないかってところです。こんなのでお金が稼げるのだろうか?(いや、稼げない)んな反語はさておき稼ぐ人は相当強い人です。でも一回その波に乗れば働かなくて生きていけるかもです。もし自分がその立場になったら自慢しまくります。

稼いでいる人はすげえ

ブログをやってから稼いでいる人のブログを見に行くことが多くなったのですが、ブログで稼ぐ人はやっぱり地道な努力をしてるんですよ。

毎日投稿は当たり前だったり、ブログを覗いてみるとやはり凝ってるし、めちゃくちゃ見やすい。見に行くと相当な努力をしているのが分かる。学生でほかにバイトをしている自分にとっては大変だなあと他人事のように感じる次第!!

楽して稼げると思ってたのに、、、全然楽じゃない、、、

 

ってか、楽して稼ぐ考えを悔い改めよという感じですね。でも将来的にガチでブログで小遣い稼ぎをしたいと思ってる。

 

ブログのPV伸ばすのに大切なのってまずはSNSの活用だと思うんですよ。SNSってみんな見てるし、炎上したらその分有名になってブログのPVが増える!!

 

だから炎上商法が流行ってるんだよね、、youtubeもそうでよくyoutuberが釣りのサムネやタイトルをつけて視聴者を増やすのと一緒!!だから香ばしいタイトルをつけてブログを綴っている人を見ると、本心でなくてもわざと書いているのかなあと思ってみているのが最近の自分なんですよ。

そんなこんなでどうしたら閲覧数が増えるのか考えていたら、心理学やマーケティングっぽい考えだなあと思ってしまう。

ブログで稼いでいる人もいろいろ勉強しているんですよね、、、めちゃくちゃ努力家ジャン、、、、、

 

今後について

楽して稼ぎてえて思って始めたブログも結局大変だった。けど将来的に金持ちになるか、金持ちと結婚して紐になることを考えている自分にとってもう少しブログを続けてみようと考えている。

これから金を稼ぐ人は自身のメディアを持っている人だと思っている。Youtuberや配信者もしかりブロガーもしかり、VRなどが流行ってくる時代ならなおさらその傾向が強くなる。だからこそ情報を発信することの重要性が増えて行くと思う。

最後はなんだか真面目な内容を話していたが、結論として楽して稼げる仕事なんてねえ

 

なんか楽して稼げる方法があれば教えてくれ、ツイッターのDMでもよいのでお願いします。

 

pythonで戦うAtCoder競技プログラミング

今回はAtcoderpythonを使用するときに、便利な考え方があるので共有したいと思います。(初心者向け)

  1.   AtCoderとは、
  2.   どんな問題があるの?
  3.   結構使えるappend()について
  4.   appendと同じ機能のモジュールについて

   1.AtCoderとは

AtCoderとは、オンラインで参加できるプログラミングコンテスト競技プログラミング)のサイトです。

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwjpmuvB-dHkAhUlK6YKHUuAAp8QFjAAegQIABAB&url=https%3A%2F%2Fatcoder.jp%2F%3Flang%3Dja&usg=AOvVaw3X9-d3kTisT18ube_RPiGO

よく競プロ呼ばれたりしています。コンテストは大体土日の週末に開催されコンテストに出場するとレートが決まって色分けされます。色は黒・灰・茶・緑・水・青・黄・橙・赤となっています。赤が一番上で上位0.3%くらいだったかな、、、、

このくらいいくと大手企業からスカウトとか来るのかな、、、、????

ここのレベルまで達したら報告しますね。

   2.どんな問題があるのか

今回はBeginner contestについて話します。

問題構成としては、A,B,C,DまたはA,B,C,D,E問題に分かれています。

A問題は基本的な四則演算ができれば大丈夫なレベルです。

B問題はfor文やif文や配列の知識があれば大丈夫だと思います。

C問題からは少しレベルが違うように個人的には思いますね。

また、Atcoderの問題は入力形式が少し独特なので事前に調べておくといいと思います。覚えれば大体同じような入力形式なので。。

atcoder.jp

このような問題がB問題です。この問題を例題にpythonのappendを説明します。

   3.結構使えるappend()について

僕はこのB問題をこのように解答しました。

N = int(input())
V=list(map(int,input().split()))
C= list(map(int,input().split()))
a=[]
for i in range(0,N):
  if V[i]>=C[i]:
    a.append(V[i]-C[i])
  else:
    continue
print(sum(a))

この問題文を読むと難しく感じる人もいると思いますが、根本の問題としては配列Vと配列Cの差が正の場合それの合計を出力するプログラムを書け!!ということなんですね!

Atcoderは問題の本質を理解することが一番大切だと思います。

 ここでappendについて説明したいと思います。

 配列.append(要素)というように書き,リストに括弧内の要素を追加することができるのです。これが意外と使える。

B問題の場合各配列のV-Cが正なら配列aに計算結果を挿入しています。最後にsum()を使えば終了です。

   4.append()と同じようなモジュール

heapqは知っていますか?これはappend()と同じこともできます。また、heapqは様々な場面で使えるのでこれも覚えておくとatcoder以外でも使えるでしょう。ここにheapqが詳しく書いてあるので見てみてください。

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwjKzNrIh9LkAhXIyIsBHRUHADAQFjAAegQIAxAB&url=https%3A%2F%2Fdocs.python.org%2Fja%2F3%2Flibrary%2Fheapq.html&usg=AOvVaw3kKlXzloivUBWc01GJ1aFA

下にheapqを使用した場合のコードを載せました。実行時間は、heapqをモジュールしたほうが172 msでappend()を使用したほうが189 msでheapqをモジュールしたほうが早いことが分かりました。理由はわからん!!

ぜひ自分でもやってみてください。

import heapq
N = int(input()) 
V=list(map(int,input().split())) 
C= list(map(int,input().split())) 
a=[] 
for i in range(0,N): 
  if V[i]>=C[i]:
    heapq.heappush(a,(V[i]-C[i])) 
  else:
    continue 
print(sum(a))