病む大学生

最近大学の友達で病んでる人が多いので、ぼくが病まないために心がけていることを書きます。

 

ぼくは大学に入って初めて「メンヘラ」なるものを目撃しました。高校まではメンヘラなんて生き物はネット上の架空の生き物だと思っていましたが、大学に来てメンがヘラっている人を結構見るようになりました。

 

なぜ人生の夏休みを謳歌しているはずの大学生が病んでしまうのでしょうか?

 

これは僕の個人的な考えですが、大学生はいろいろな活動へのコミット度を自由に決められる分、かえってごく少数の活動orアイデンティティ固執してしまっている人が多いのではないかと思います。

 

中学生や高校生は、一日のスケジュールのかなりの部分が固定されてしまっています。朝早くに起きて夕方ぐらいまで勉強をさせられ、放課後は多くの人が部活動を行います。そして夜家に帰ったら各自が好きなことをする、という生活が一般的です。

そのため、大抵の中高生は勉強・部活・個人のやりたいことという3つの活動を行なっているということになります。

なんにでも好調な時と不調な時がありますが、3つの分野で同時に不調になることは中々起きないので「これがダメでもあれがある」となり病み期に入りにくいのではないでしょうか。

 

一方、大学生は中高生と比べてめちゃくちゃ自由に時間を使えます。授業、サークル、バイト、恋愛、インターン、留学、資格取得、コンパ・・・と大学生がやるアクティビティの種類は爆発的に増えますが、その一方でほとんどの学生が自分の気に入った1つか2つかに集中しているように感じます。そういえば大学の先輩が「大学生は勉強・サークル・バイト・恋愛のうち2つしかまとものやることができない」と言っていました。

そのために、自分が取り組んでいる1つか2つの活動が上手く行かないと、全てがダメかのように感じてしまうのだと思います。

 

そこで僕はこの春から、なるべくいろんな分野に手を出してみることにしました。大学のカリキュラムの都合で今年の9月まではとても暇なので、できることは色々やってみようと思います。

具体的には、

1機械学習の勉強

2、筋トレ

3、ブログ

4、経済の勉強

5、バイト

6、サークル(テニス)

6つです。1年生の時はこのうちサークルにエネルギーを注ぎすぎて精神的に不安定ぎみだったと思うので、今はなるべく重心を分散させるようにしています。

数学・機械学習関連の英単語の和訳

機械学習の勉強のためにscikit-learnのドキュメントを読んでいるのですが、数学や機械学習に関する英単語が全然わからないのでここにメモしておきます。

 

機械学習

  • regression  回帰
  • classification 分類
  • clustering  グループ分け
  • dimensionality reduction  次元削減
  • SGD  stochastic gradient descent 確率的勾配降下法
  • SVM support vector machine サポートベクトルマシン
  • SVC support vector classification
  • SVR support vector regression
  • ensemble regression アンサンブル回帰
  • ensemble 全体の 機械学習では多数決を指す
  • elastic 弾力のある
  • K Neighbors Classifier K近傍法
  • kernel approximation カーネル近似
  • K means k平均法
  • GMM gaussian mixture model ガウス混合モデル
  • MeanShift 平均値シフト法
  • VBGMM variational baysian GMM 変分混合ガウス分布
  • MiniBatch ミニバッチ 損失関数の最小化にランダムなn個を使う↔︎Batch
  • Isomap isometric mapping 等大の写像
  • embedding 埋没
  • LLE locally linear embedding 局所的な線形の埋没
  • OLS ordinary least squares 最小二乗法
  • LAR least angle regression 最小角回帰
  • discriminant analysis 判別分析
  • LDA linear discriminant analysis 線形判別分析
  • QDA quadratic discriminant analysis 二次判別分析
  • MDA mixture discriminant analysis 混合判別分析
  • covariance matrices 分散共分散行列
  • novelty detection 異常検知
  • density estimation 密度推定
  • coef coefficient 係数
  • intercept 切片
  • matrix decomposition 行列の分解
  • matrix factorization 行列の分解
  • cross validation 交差検証
  • projection 投影
  • discriminant 判別式
  • PCA principal component analysis 主成分分析
  • SVD singular value decomposition 特異値分解
  • diag diagnal 対角
  • positive definite 正定値
  • det determinant 行列式
  • cofactor 余因子

 

pythonの文字列メソッドまとめ

Pythonのstr型は次のような特徴を持っています。

  1. シーケンス
  2. イミュータブル(変更不可能、ただし変更したコピーを返す形では変換できる)
  3. r(right)やl(left)をメソッド名の頭につけた類似したメソッドを多く持つ

この記事ではPythonのstr型に使える操作をPythonの公式ドキュメント(4. 組み込み型 — Python 3.6.5 ドキュメント)からまとめました。これはPython3.6.5版でのものです。

 

シーケンス型に共通の操作

  • x in s
  • x not in s

これらは後述するfindメソッドやindexメソッド、countメソッドと同じ検索だが、「あるかないかが知りたいときは in 、インデックスが知りたいときはfindかindex、回数が知りたいときはcount」と使い分ける。

  • s + t 連結
  • s * n 繰り返し
  • s[i:j:k] スライス
  • len(s) 長さ
  • min(s)
  • max(s)

str型特有のメソッド(44個)

※このうちindex()とcount()はシーケンス型に共通ですが、メソッドなのでわかりやすさのためにこちらに入れました。

1文字列を判別するもの 13個

  • endswith(suffix)

文字列の終わりがsuffixならTrue,違ければFalseを返す。

  • startswith(preffix)

文字列の始まりがpreffixならTrue,違ければFalseを返す。

  • isalnum()

文字列全てが英数字&1文字以上→True

  • isalpha()

文字列全てが英字&1文字以上→True

  • isdecimal()

文字列全てが十進数字&1文字以上→True

  • isdigit()

文字列全てが数字&1文字以上→True

  • isidentifier()

文字列全てが有効な識別子→True

  • islower()

大小の区別がある字が存在&大文字がない→True

  • isnumeric()

文字列全てが数を表す(digitより条件が緩い)&1文字以上→True

  • isprintable()

文字列全てが印字可能or0文字→True

  • isspace()

文字列全てが空白文字&1文字以上→True

  • istitle()

タイトルケース文字列&1文字以上→True

  • isupper() 

大小の区別がある字が存在&小文字がない→True

 

2文字列を検索するもの 5個

※[ ]はその引数が任意なことを表す。

  • find(substring[,start[,end]])

文字列に部分文字列substringがあったら、そのインデックスが最小のもののインデックス、なければ-1を返す。検索範囲を指定できる。

  • index(substring[,start[,end]])

文字列に部分文字列substringがあったら、そのインデックスが最小のもののインデックス、なければValueErrorを返す。検索範囲を指定できる。

  • rfind(substring[,start[,end]])

文字列に部分文字列substringがあったら、そのインデックスが最大のもののインデックス、なければ-1を返す。検索範囲を指定できる。

  • rindex(substring[,start[,end]])

文字列に部分文字列substringがあったら、そのインデックスが最大のもののインデックス、なければValueErrorを返す。検索範囲を指定できる。

  • count(substring[,start[,end]])

文字列中に部分文字列substringが重複せずに出現する回数を返す。

3文字列を除去するもの 3個

  • strip([chars])

文字列の先頭および末尾からcharsを除いたコピーを返す。charsは取り除く文字列ではなく取り除く文字の集合。Ex: char=abcならaとbとcを取り除いていく。charsが省略されたら空白文字を取り除く。

  • lstrip([chars])

文字列の先頭からcharsを除いたコピーを返す。charsは取り除く文字列ではなく取り除く文字の集合。Ex: char=abcならaとbとcを取り除いていく。charsが省略されたら空白文字を取り除く。

  • rstrip([chars])

文字列の末尾からcharsを除いたコピーを返す。charsは取り除く文字列ではなく取り除く文字の集合。Ex: char=abcならaとbとcを取り除いていく。charsが省略されたら空白文字を取り除く。

4文字列の幅を整形するもの 4個

  • center(width)

widthの長さを持つ中央寄せされた文字列を返す。

  • ljust(width)

widthの長さを持つ左揃えされた文字列を返す。

  • rjust(width)

widthの長さを持つ右揃えされた文字列を返す。

  • zfill(width)

長さがwidthになるようにASCII'0'で左詰めした文字列のコピーを返す。

 

5文字列の大文字・小文字を操作するもの 6個

  • upper()

全ての大小文字の区別のある文字を大文字に変換したコピーを返す。

  • lower()

全ての大小文字の区別のある文字を小文字に変換したコピーを返す。

  • capitalize()

文字列の先頭を大文字、残りを小文字にする

  • title()

単語の先頭を大文字、残りを小文字にする。

  • casefold()

大文字小文字に関係ないマッチに使えるコピーを返す。

  • swapcase()

大文字が小文字に、小文字が大文字に変換された文字列のコピーを返す。

6文字列を分割するもの 5個

  • partition(sep)

文字列をsepの最初の出現位置で区切り、区切り前・区切り文字そのもの・区切り後の3要素から成るタプルを返す。

  • rpartition(sep)

文字列をsepの最後の出現位置で区切り、区切り前・区切り文字そのもの・区切り後の3要素から成るタプルを返す。

  • split(sep)

文字列をsepを区切り文字として区切った単語のリストを返す。キーワード引数maxsplitを与えることができる。

  • rsplit()

文字列をsepを区切り文字として右側から区切った単語のリストを返す。キーワード引数maxsplitを与えることができる。

  • splitlines()

文字列を改行部分で分解し、各行からなるリストを返す。

7文字列を変換するもの 7個

strからbytesへ
  • encode()

文字列のエンコードされたバージョンをバイト列オブジェクトとして返す。

tabからspaceへ
  • expandtabs()

文字列内のタブをスペースに変えたコピーを返す。

1:1対応の変換
  • maketrans()

静的メソッド。translateメソッドで使う変換テーブルを作る。

  • translate(table)

与えられた変換テーブルに基づいて文字列を構成する各文字をマッピングし、マッピング後の文字列のコピーを返す。

様々な書式に変換
  • format(*args,**kwargs)

文字列の書式化操作を行う。めっちゃ便利だけど規則が多いので、詳しいことは

6.1. string — 一般的な文字列操作 — Python 3.6.5 ドキュメント

の「6.1.3.1. 書式指定ミニ言語仕様」を見てください。

  • format_map()

formatと似た働きだけど引数がmappingの時にいいことがあるらしい。

特定のものに置き換え
  • replace(old,new)

文字列をコピーし、現れる部分文字列old全てをnewに置換して返す。

8文字列を作成するもの 1個

  • join(iterable)

joinをつける文字列を区切り文字としてiterableを連結し、str型を返す。"".join(iterable)なら区切りなしになる。これはstrへの操作というよりiterableへの操作と思った方が良さそう。

プログラミングに写経はどのくらい効果があるのか試してみた

よくプログラミングの勉強はひたすら写経するのがいいという話を見るので、実際にやってみて確かめることにしました。

 

現在の自身のレベル

 

僕の今のレベルはプログラミングを初めて3週目ぐらいで、CheckiOの問題でいうとElementary(一番簡単)が6割ぐらい、Simple(二番目に簡単)は3割ぐらいしか解けないぐらいです。

 

写経材料

github.com

www.programiz.com

 

やり方

・とりあえずjupyter notebookに写してみる

・分からないことがあったらみんなのPythonか公式ページで調べる

 

30-seconds-of-python-codeの感想

・30-seconds-of-python-codeはリスト、数学、オブジェクト、文字列に別れていて30個ある。一個一個は3〜10行ぐらいですぐ終わるがlambdaやrecursion(再帰)など難しいところもあった。

・「capitalize」にあった

string[1:].lower() if lower_rest else string[1:]

のように、自分で書く時より短くていい感じの書き方がわかった気がする。

Python Programming Examplesの感想

・最初の方はHello Worldや正負の判定のような簡単すぎるものなのでやらなくていいと思った。

・中盤は数学系の問題が多い。アームストロング数とかはそもそも存在を知らなかった。

・4つのテーマ(フィボナッチ数列、ある数までの自然数の和、階乗、10進数から2進数への変換)について普通にwhile文とかを使ってやる場合とrecursion(再帰)を使ってやる場合が載っていたのがとても勉強になった。

 

結論

上手い人の書き方を身につけるという点では役に立つと思った。ただ今回色々調べ物しながらでも4時間ぐらいで終わってしまい、適切な難易度・長さのサンプルコードもなかなか見つからないので写経だけで勉強するのは難しいと思った。