投稿

2018の投稿を表示しています

【振り返り】2018年の振り返りと来年の抱負など

こんにちは、ぐぐりら( @guglilac )です。 年末も年末、大晦日ですが、皆様いかがお過ごしでしょうか。 僕はインフルエンザにかかってしまい、寝たきりです。。。 イナビルを使ってずっと寝ていたので熱はもうないのですが、家族に移してはいけないので部屋に引きこもっています笑笑 解熱後ヒマになる、インフルあるあるですね。 家族と実家で暮らしているのですが、みんなが大掃除したり正月の準備をしていたりするので申し訳ない気持ちでいっぱいですが、手伝うとインフルばらまくので大人しくしています。。。 前置きが長くなりましたが、このブログを再開してちょうど一年ぐらい経つこのタイミングで、読んでくださった方へ感謝しながら2018年を振り返りつつ、来年の抱負などを書いていこうかなと思います。 ブログ再開 こちらのブログに引っ越してきたのが一年前の年末でした。 そのまえにも一応ブログは書いていたのですが、今のようなプログラミングの記事ではなく読書ブログでした。 引っ越す際にこちら記事だけ持ってきたので読めますが、読み返してみると恥ずかしくてこれが黒歴史かあ、と感慨深いです。 当時はプログラミングには興味あったけどやったことはなく、いつかやれたらいいなと思っていました。 いや、ちょっとやってたかな?教本買って写経してやめてを繰り返していた気もします。 あれから数年経って、プログラミングするようになり、研究とかもやるようになってこっちの道で生きていきたいなと思い始めたのもあり、なんらかの技術発信の場所が欲しいと思って始めました。 1年間ちゃんと続いてよかったです。当初思っていたよりもたくさんの方に読んでいただけたことや、自分の勉強のモチベ維持になったりといいことずくめでした。 ブログも運用しようとなるとわからないことも多いのですが、ググり力のおかげでどうにかなっています笑 何事も勉強ですね。 いつかはtwitter就活できるぐらいになったらいいなと思ったりもしますが、まあ少しずつ活動を広げていければいいかなぐらいに思っています。 記事の内容も技術的な内容のものだけではなく、雑記的な記事も混ぜています。 うなぎの骨記事とか。 うなぎの小骨が喉に刺さってまじでしんどかったので耳鼻咽頭科行ってきた

【論文紹介】Anomaly Detection using One-Class Neural Networks

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 論文紹介記事です。 紹介する論文は以下の論文です。 <a href="https://arxiv.org/abs/1802.06360">Anomaly Detection using One-Class Neural Networks</a> (追記 : この記事を書いた時はまだドラフト段階だったようで、その後いろいろ書き換えられていたのでこの記事と微妙に違う部分があります。) ## 1行まとめ 異常検知で用いられるone class svmをneural networkに適用した研究。 ## 既存研究 deepをつかうもの、one class的な考え方のものが列挙されていた * NNを使用して得た特徴ベクトルをOC-SVMに用いる手法(=hybrid型) * Deep Autoencoderを使う系のもの * one class svm hybrid型では特徴ベクトルの獲得が異常検知用にカスタマイズされたものではないため、非効率的である。 一方、提案手法では特徴量獲得もOne-Class 的な考え方に基づいて行われるように改良し、性能改善が期待できるとのこと。 ## One class SVMの仕組み 普通のSVMは分類をのためのアルゴリズム。 そのため教師あり学習に属する。 一方One class SVMは教師なし学習であり、正常なデータのみを用いて異常を検知する。 SVMでは、正例と負例のマージンを最大化するように境界面を決定する。 One class SVMは、原点と正常なデータのマージンを最大化するように境界面を決定する。 <div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-5wXsyHDOo7k/XAuLGQwhlWI/AAAAAAAAAa0/MtNPewxjTp00XoQ

人生で初めて公開したWebアプリNumeron appの紹介

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 今年の夏に、初めてwebアプリを公開したのですが、あんまりその詳細とかを紹介してきませんでした。 (作った直後にインターンが立て続けに入っていたのが原因なのですが。。。) これです。 <a href="https://3.bp.blogspot.com/-BJSXa22SKtE/W_lnszDYOiI/AAAAAAAAAao/moIVi50Faw0VhuMwRUjgTkfk4tRxYvxtwCLcBGAs/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2018-11-25%2B0.00.33.png" imageanchor="1" ><img border="0" src="https://3.bp.blogspot.com/-BJSXa22SKtE/W_lnszDYOiI/AAAAAAAAAao/moIVi50Faw0VhuMwRUjgTkfk4tRxYvxtwCLcBGAs/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2018-11-25%2B0.00.33.png" width="400" height="191" data-original-width="745" data-original-height="355" /></a> <a class="embedly-card&

【論文紹介】Introspective Classification with Convolutional Nets(NIPS2017)

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 NIPS2017にでてたこの論文を読んだので、サクッとまとめようと思います。 <a href="https://papers.nips.cc/paper/6684-introspective-classification-with-convolutional-nets.pdf">Introspective Classification with Convolutional Nets</a> ブログに読んだ論文をメモするのは初なので変なところがあればご指摘お願いします。 ## 概要 識別モデル自体にデータを生成させて学習データに混ぜることで識別性能を向上させる手法をCNNに組み込んだIntrospective Convolutional Net(ICN)を提案した。 ## なんで選んだのか * 画像系でdeep learningする感じのっていまどんなのがあるのか知りたいなとおもって 実際には画像に適用する必然性があんまりないような手法だったのであれでしたが、まあ勉強になったのでよし。 ## 気持ち より学習に用いたら精度が上がりそうなデータを使って学習したいよね、という気持ちから作られたモデルはいくつかあって、 * active learning * boosting * data augmentation などあるけど、これらは自分で生成はしない。 識別モデル自体にhard exampleを生成させて学習を進めようというのがこの論文でやりたいことです。 Introspectiveは「内省的」とかそんなかんじの意味で、自分が分類した結果が間違ってると疑いながら反省しつつ学習を進めていく感じが表現されていますね。 ## 関連研究 1. GDL(http://pages.ucsd.edu/~ztu/publication/cvpr07_gdl.pdf) 2. GAN 3. Self supervised boosting(https://papers.nips.cc/paper/2275-self-supervise

Mojaveに更新したらiterm2のhot keyのダブルタップだけが効かなくなった

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 最近忙しくてブログ更新できていないのですが、記事のネタはいくつか溜まってきているので時間見つけてアウトプットしておこうと思います。 今回は、iterm2に関するトラブルシューティングです。 ## 症状 Macbook proを使っていて、Mojaveに更新してください更新してくださいうるさかったので、更新したのですが、 更新を終えて再起動をかけるとitermのhot keyが効かなくなっていました。。。 iterm2のhot keyについてはこちらで紹介しています。 <a href="http://www.smartbowwow.com/2018/05/iterm2hotkey.html">iTerm2をHotKeyで起動した時にフルスクリーンで重ねて表示する</a> 自分のPCでは、controlキーをダブルタップでどこでもターミナルが全画面で表示されるように(しかも開いているアプリに覆いかぶさるように)しています。 これ便利でどのPCでも基本的にこの設定にすぐしてしまうぐらいすきなのですが、今回のMojave更新でこのhot keyが効かなくなりました。 論文読んでいる最中だったのですがもちろん中断して解決に取り組みました。 大慌て。 ## 解決方法 ぐぐってもあんまりなくて、こまったなーと思っていたらどっかの英語の記事で、 itermのアクセス権限を確認してみて!(意訳) みたいな事が書かれていて、自分のケースとちょいちがうけどまあいっかと思い、確かめてみました、 システム環境設定>セキュリティとプライバシー>プライバシーといって、 アクセシビリティを選ぶと、itermのとこが許可されていませんでした。 <a href="https://4.bp.blogspot.com/-ItU9NKIR3lE/W-7Av2kIELI/AAAAAAAAAaI/GXLOPBX6rCQaBz9am1ik9Oz4p2FBO5C3wCLcBGAs/s1600/%25E3%2582%25B

【振り返り】2018年 8月~10月

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 最近、研究やら研究やらが忙しくてブログが更新できていなかったのですが、宣言通り8月~10月の振り返り記事は書こうと思います。 というのも、前回の4月~7月振り返り記事が結構なボリュームになってしまった反省があるからですね。。 この記事です。 <a href="http://www.smartbowwow.com/2018/07/47.html">4月~7月</a> 完全に自分の振り返り用ですが、理系大学院生がどんな生活をするのかの一つのサンプルとして参考になればうれしいです。 ## 8月〜食中毒になる〜 白レバーを食べたのですが、カンピロバクターに感染して一週間弱ほど倒れてました。 おそるべしカンピロバクター。 赤坂のとある飲食店で白レバーを食べたのですが、その二日、三日後ぐらいに発症。 他の食中毒より軽いため、そこまでつらいわけでもない(嘔吐とかはなかった)けれど、やはり食べたいものが食べられないのはつらいです。 病院での検査の結果、カンピロバクターが検出されたあと、その検査結果が保健所に伝えられ、疑惑のお店に調査が入ることになりました。 初めてカンピロバクターになったので、なんかおおごとになったなあと思いました。 いっしょに白レバーを食べに行った人もカンピロバクターに感染したので、これはクロでしょ〜と思っていました。慰謝料とかほしいなと。 ですが、二週間後ぐらいに、保健所による調査の結果、そのお店が原因であることが断定できないとの報告がきました。 かなり怪しいこんな状況でも判定できないとなると、逆に食中毒の原因でお店を訴えられるケースってどんなんだろ、、と頭にきましたが、深追いする気力もなく、この件は諦めました。 俺の夏休みが。。一週間消えた。 かなしみに暮れました。 ## 8月〜初のWebサービスを公開!〜 食中毒になってたときに、病床で作りました笑 Webサービスといってもちょっとしたゲームが遊べるだけのWebアプリですが笑 いままでWebアプリを作ることは何度かあったのですが、自分で

PythonのType Hinting(型ヒント)を使って静的型付けっぽく開発する

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 <a href="http://opendata.jp.net/wordpress/wp-content/uploads/2015/08/python.png" imageanchor="1" ><img border="0" src="http://opendata.jp.net/wordpress/wp-content/uploads/2015/08/python.png" width="320" height="320" data-original-width="250" data-original-height="250" /></a> ## Type Hinting(型ヒント)とは Pythonは動的型付け言語です。 動的型付け言語とは、型があっているかどうかをプログラム実行時にチェックするような言語です。 対になる静的型付け言語はプログラム実行時ではなく、コンパイル時に型をチェックするような言語です。 静的型付け言語の例としてはC++とかJavaとかがあります。 それぞれもちろんメリットデメリットあります。 動的型付け言語であれば型を気にせず自由に書いていいので、さくさく書いていけるのですが、型が違うことによるバグを見つけるのに苦労したりします。 静的片付け言語であればそのようなバグが埋め込まれる危険性が少ない(型安全とかいう)のですが、いちいち型を指定した変数を定義しないといけないのでコードの量が多くなったりします。 そんな動的型付け言語であるPythonに、型ヒント(Type Hinting)という機能があります。 簡単に言うと、動的型付け言語であるPythonを静的片付け言語のように使うことができるのです! といってもPythonはC++のようにコンパイルを先にするわけではないので、コンパイル時に型があっているかチェックするわけではありません。

大きな数の組み合わせを1000000007で割った余りを計算する方法

こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 大きな数の組み合わせの$10^9+7$で割ったあまりを求めたくなることってありますよね(唐突) $M=10^9+7$とします $x={}_n C _r \ mod\ M$ の、$n$とか$r$が大きい場合。 ${}_n C _r=\frac{n!}{r!(n-r)!}$ であり、$n$とか$r$が大きい数の場合にはこれを計算したあとに$M$で割ったあまりを求めようとしてもオーバーフローしてしまうためにそもそも組み合わせ自体が計算できません。 でもどうにかして$x$を求めたい。 そういう場面で使える方法についての話。 ## とりあえずやってみる 普通に分母がなくて、なにか大きい数の階乗のmodを計算したい場合は簡単で、 ```c int a=1; for (size_t i = 1; i <= N; i++) { a = (a * i) % M; } ``` みたいに一個ずつかけたら$M$で割ることを繰り返せばオーバーフローしないで済みます。 これができるのは、合同式が積については計算可能であることが背景にあります。 つまり mod $M$に対して $a \equiv b$、$c \equiv d$であれば$ac \equiv bd$が成り立つことが裏にあります。 これにより、全て掛け合わせたあとにあまりを出さなくても、階乗の途中でmodを計算してもいい、ということになります。 今回難しいのは、組み合わせの式には分母にも数字が来ることです。 分母の数字も同様にmodを計算して、その数でさっき求めた分子の合同式での値を割ればいいのでは、と思われるかもしれません。 ですが、これは誤りです。合同式は割り算に対しては上手く計算できません。 ## 割り算を掛け算に変換 合同式は割り算が苦手なので、掛け算に直してしまう方法が解決策となります。 $M=10^9+7$は素数なので、フェルマーの小定理を用いることでこれが実現できます。 >フェルマーの小定理 > >

AtCoderですべてテストを通ったら自動で提出する

こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 こちらの記事で、AtCoderの提出コードを自動テストするツールを作成した話をしました。 <a href="http://www.smartbowwow.com/2018/09/atcoder.html">Atcoderで使えるコード自動テストツールを作った</a> コマンド一つで、指定した問題の全サンプルをスクレイピングしてきて、それぞれのケースについて正しい出力が得られているかをチェックします。 スクレイピングする際にログイン機能が必要になるのですが、そこらへんを作っていると 「自動提出もsessionを使えば、data渡してpostする処理だし一緒じゃん!つくろ」 となったので勢いで作りました。 ### サンプル サンプルは以下になります。 ```python:submit.py import requests from bs4 import BeautifulSoup import sys import config import os.path # パラメータセット args = sys.argv level = args[1] round = int(args[2]) prob = args[3] LOGIN_URL = "https://beta.atcoder.jp/login" task_screen_name = "{}{:03d}_{}".format(level, round, prob) CPP_ID = 3003 source_path = "{level_camel}/{level}{round:03d}/{level}{round:03d}{prob_camel}.cpp".format( level_camel=level.upper(), level=level, round=round, prob_camel=prob.upper()) if os.path.exists(source_path):

AtCoderで使えるコード自動テストツールを作った

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 <a href="https://pbs.twimg.com/profile_images/378800000000403108/c8cfcb35c76ca5fc55fc2dc680685e8c_400x400.png" imageanchor="1" ><img border="0" src="https://pbs.twimg.com/profile_images/378800000000403108/c8cfcb35c76ca5fc55fc2dc680685e8c_400x400.png" width="320" height="320" data-original-width="400" data-original-height="400" /></a> Atcoderを初めて、4ヶ月ぐらい経ちました。 あんまり上達してないのでモチベが下がってきてはいますが、まあ気長にこつこつ進めていこうと思います。 始めたころに、atcoderやる上でだるいなーと思った処理を自動化するコードを書きました。 <a href="http://www.smartbowwow.com/2018/05/atcoder.html">AtCoderを始めてみて面倒に感じた作業をシェルスクリプトにしてみた</a> 今回はこの続き。 他の面倒な処理を自動化するお話です。 4ヶ月間、不便だなーと思いながらもサンプルケースをサイトからコピーしてきて、自分の入力用のファイルに貼り付け、一つ一つ実行して答えがあっているかを目視で確認してきました。 これ、一発でできそうだしツール作っちゃいたいなーと思ってはいたのですが、なにしろ飽きっぽい性格なのでatcoderいつやめるかもわからず、作るだけ作って放置しそうで作れずにいました。 まあ4ヶ月続いたしそろそろ作って

リクルートサマーインターンシップに行ってきた

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 夏のインターンシップ体験談記事、第二弾はリクルートです。 Recruit Internship for Specialist 2018 -DATA SCIENCE × BUSINESS-に参加してきました。 <a href="https://www.recruit-jinji.jp/event/summer-internship-2018-data-scientist/">Recruit Internship for Specialist 2018-DATA SCIENCE × BUSINESS-</a> ちなみに第一弾はYahooです こちら <a href="http://www.smartbowwow.com/2018/09/yahoo-japan.html">Yahoo Japanのインターンにいってきた</a> 9月10月11月と3ターム開催されるのですが、自分は9月に行きました。 夏はエンジニアコースとデータ解析コースの2種類あるのですが、自分はこのデータ解析の方に参加しました。 業務の内容はかけないので、それ以外(主にごはんの画像)を上げていこうと思います。 飯テロ記事です。 ## 参加するまで 履歴書や、プログラミングでないテスト(なんていうのあれ、SPI?)があって、その後web面接が二回あった気がします。 一回目は人事の方とで、そのあとエンジニアの方との面接だったような。遠い昔すぎて記憶が定かではないですが笑 プログラミングテストがなかったのでびっくりしました。 エンジニアコースの人はあったみたいです。 合格連絡が、月末のどっかに合格者のみに電話がいくシステムでした。 自分が一番嫌いなタイプのあれです。そわそわするやつ。 サイレントお祈りを5月ごろ受けたインターンでされてから嫌いになりました。 でも今回はそわそわすることなかったです。 ちょうどそのころ食中毒になっていてずっと寝込んでいたからです。 おそるべしカンピロバクター。おそ

C++の割り算切り上げ(ceil関数)でハマった

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 <a href="https://juststickers.in/wp-content/uploads/2016/09/c-plus-plus.png" imageanchor="1" ><img border="0" src="https://juststickers.in/wp-content/uploads/2016/09/c-plus-plus.png" width="320" height="320" data-original-width="528" data-original-height="528" /></a> ## 症状 xをTで割って切り上げる処理を行ったときに、 以下の二つが等しくならない時があった サンプルケースではなかったのでどの入力でなっているのかわからんかった ```c++ std::ceil((double)x / T) (x + T - 1) / T ``` xもTもlong long。 ## 型を調べる まず、型を調べる方法を知らずに、出力してみたときの表示を見て型を推定していたのが間違いだった。 double型を出力したら1.0というような形式で出力されると思い込んでいた。 実際には、以下を実行すると、出力は1.0ではなく1になる。 ```c++ double hoge = 1.0; std::cout << hoge << '\n'; ``` ceil関数の返り値も出力してみると整数で表示されたので、てっきり整数型で返ってきているのかと思ったけど、普通にdoubleだった。 ドキュメントにはもちろんdoubleが返ってくると書いてある。あほすぎる。 ちなみに、型を調べるのはこんな感じでかけるみたいなので、今後積極的にデバッグに使っていきたい。 ```c++:型の調べ方 double

Yahoo Japanのインターンにいってきた

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 サマーインターンとして、2週間Yahoo Japanにおじゃましてきました。 ヤフー株式会社 - 採用情報 - インターンシップ 技術的なものや具体的な課題、データなどはSNSなどにアップしないように言われていたのでブログもだめかなーと思っていたのですが、最終日に体験談をブログに書いてもいい(というか書いてください!とのことだった)ので、かける範囲で書こうと思います。 <div class="separator" style="clear: both; text-align: center;display:none;"><a href="https://4.bp.blogspot.com/-uqAKS5dONXY/XFUJQubXkJI/AAAAAAAAAd4/8dWaQE-GeqUzpTrmToafIDkqR__MNIK_wCLcBGAs/s1600/%25E3%2582%25BF%25E3%2582%2599%25E3%2582%25A6%25E3%2583%25B3%25E3%2583%25AD%25E3%2583%25BC%25E3%2583%2588%25E3%2582%2599.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-uqAKS5dONXY/XFUJQubXkJI/AAAAAAAAAd4/8dWaQE-GeqUzpTrmToafIDkqR__MNIK_wCLcBGAs/s320/%25E3%2582%25BF%25E3%2582%2599%25E3%2582%25A6%25E3%2583%25B3%25E3%2583%25AD%25E3%2583%25BC%25E3%2583%2588%25E3%2582%25

C++で逆順forループするときにsize_tを使ってハマった話

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 <div class="separator" style="clear: both; text-align: center;"><a href="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQH8p8IMkADBlXLb2qlkZwltzrHPYkW--ouC1tFpX47GuH32KO9" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQH8p8IMkADBlXLb2qlkZwltzrHPYkW--ouC1tFpX47GuH32KO9" width="320" height="320" data-original-width="225" data-original-height="225" /></a></div> ## 概要 ```c++ for (size_t i = 10; i >= 0; i--) { } ``` ってして、10から0まで降順に走査しようとしたらバグりちらかした ```c++ for (int i = 10; i >= 0; i--) { } ``` こうするといけた. そもそもsize_tについてなんもしらないけどatomでforって入力すると予測変換ででてくるので使っていました。 で、今回逆順にループを回す処理を書いてみたらバグったわけです。 ## 原因 まあ簡単なことで、ブログに書くほどのことでもないんだろうけど、勉強し始めなので一つ一つ基礎的なこと

atomでc++の設定(linter-gccやatom beutify)

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 ## コンパイルできるのに静的コード解析にひっかかってた <div class="separator" style="clear: both; text-align: center;"><a href="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQv3lYEpdz2dj7w_F4r3TW3su5Si4amVh9nnokFIXzjpyXsn5GA" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQv3lYEpdz2dj7w_F4r3TW3su5Si4amVh9nnokFIXzjpyXsn5GA" width="320" height="205" data-original-width="281" data-original-height="180" /></a></div> vectorの配列を作りたいと思ってこんなコードを書いたら、atomのlinterさまに怒られてしまいました。 ```c++:hoge.cpp int N,M; std::cin >> N >> M; std::vector<int> D[N]; ``` `D[N]`のところを3とかに変更すると赤い波線が消えます。 また`int D[N]`に変えても怒られなくなります。 vectorの配列の長さを文字で与えられない、そんなことある?とおもってatomに怒られながらもコンパイルしてみると、あっさり通りました。

pythonのあの処理をC++書いてみようシリーズ①

こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 ## このシリーズはなに これまでpythonを使うことが多かったのですが、せっかく競プロをやってるのだからC++も勉強したいなあと思い最近勉強を始めました。 pythonならさくっと書けるあの処理、どう書くんだろう、、ということがよくあるので、勉強したところだけまとめておこうと思います。 最近はpythonでプログラミングを始める人も多いみたいだし、pythonならわかるけど他の言語も勉強してみたい、的な方にも役に立てばいいなと思います。 (シリーズとかいって一回で終わらないようにせねば) ## 今回のテーマとなる処理 タプルのリストをsortする処理をしたくなるときがたまにありますよね。 こんなやつ ```python a=[(1,2),(3,1),(10,6),(5,4),(2,7)] ``` いくつかの要素をまとめたものをpythonではタプルと言います。 これを何も考えず`sort()`で並び替えるとこうなります。 ``` a.sort() print(a) #=> [(1, 2), (2, 7), (3, 1), (5, 4), (10, 6)] ``` みて分かる通り、タプルの1個目の要素をみて昇順に並び替えてくれます。 今回は、タプルの2番目の要素をみて昇順に並び替える処理について考えます。 pythonでは、`.sort()`に基準となるキーをlambda式で与えてあげることで簡単に実現できます。 ```python a.sort(key=lambda x: x[1]) ``` これは、 「aの各要素がxとしたとき、x[1]をkeyとして並び替えてね」 という処理になります。 簡単ですね。 ## C++だとどうかくの ```c++ #include <iostream> #include <vector> #include <algorithm> typedef std::pair<int, int> pair; void print(st

PyTorch v0.4での変更点

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 <div class="separator" style="clear: both; text-align: center;"><a href="https://i2.wp.com/hacks.deeplearning.jp/wp-content/uploads/2017/10/21003710.png?fit=200%2C200&ssl=1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://i2.wp.com/hacks.deeplearning.jp/wp-content/uploads/2017/10/21003710.png?fit=200%2C200&ssl=1" width="320" height="320" data-original-width="200" data-original-height="200" /></a></div> Pytrochをちょうど使い始めたときにバージョンが0.4に上がっていろいろ変わったので、勉強したことをまとめました。 バージョンがまだ小さいので変更点も大きなものが多いため、ちゃんとキャッチアップしていかないとですね。 変更点を全て書いているわけではないのであしからず。 ## tensorとvariable 今までふたつの型があった. Tensor:計算グラフ(勾配情報)を保持しないもの Variable:計算グラフを保持するもの 0.4になるときにこれらは統合された。 Tensor型に`requires_grad`という値が追加された。 `requires_grad=true`が今までのvariabl

GitHubの画面を黒くする(Stylus, Stylish)

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 <div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-UsaUiMK_Cos/W3Y0rPkkS3I/AAAAAAAAAMQ/759LsDCLm3s771Xh-Ra8Qd6TPrF1fsxHwCLcBGAs/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2018-08-17%2B11.26.07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-UsaUiMK_Cos/W3Y0rPkkS3I/AAAAAAAAAMQ/759LsDCLm3s771Xh-Ra8Qd6TPrF1fsxHwCLcBGAs/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2018-08-17%2B11.26.07.png" width="400" height="152" data-original-width="1131" data-original-height="430&quo