2024年4月15日月曜日

Easy PBR を使ってマテリアルを増やす 2【blender】

 準備が出来たら[Shading]タブを選択し、Nキーを押すと横から[EPBR]のタブが出てくるので、そのタブを選択してから、上のツリー好きな素材を選びます。

素材を選んだら、下の[↓]アイコン(Download This Shader)を押し解像度を選択します。



好きな解像度を選び[OK]を押すとマテリアルのダウンロードが始まり、終了すると[+]ボタンが押せるようになるので押すと適用されました。













Easy PBR を使ってマテリアルを増やす【blender】

Blenderでマテリアルをすべて自分で作るのは至難の業です。

簡単に質感が出せるBlenderのアドオンEasy PBRを使ってみましょう。

まずEasy PBRのサイトから右のフォームに『0』を入力、寄付する場合は任意の価格で下の購入ボタンを押します。




するとメールアドレス登録欄が出るので自分のメールアドレスを入れます。



するとダウンロード欄に行くのでBlender 3の場合は「EasyPBR__0.9.3__Beta.zip」「EPBR_library.zip」ファイルをダウンロードします。



ダウンロードしたファイル「EPBR_library.zip」は解凍し「Easy_PBR_library」フォルダにしてから任意のフォルダに入れてください(分かりやすいようにblender\assetなど)

そうしたら準備完了! Blenderを起ち上げてから[Edit]→[Preferences]→[Add-ons]と通常のアドオンを入れる手順から右上の[Install]を押すとBlender File Viewウインドウが開くので先ほどの任意のフォルダを開きます。



そして先ほどのzipファイル「EasyPBR__0.9.3__Beta.zip」を選択し


「Material: Easy PBR」にチェックを入れ、矢印を展開すると下に「PBR Library Path:」という欄があるので、先ほど解凍した「Easy_PBR_library」フォルダを選択し[Accept]を押します。



左下の[Save Preferences]を押しセット完了です。




2022年12月2日金曜日

サイコロ振って中心極限定理を確かめる

 中心極限定理とは、

中心極限定理は標本平均と母平均との誤差を論ずるものである。多くの場合、母集団の分布がどんな分布であっても、その誤差は標本の大きさを大きくしたとき近似的に正規分布に従う。wikipedia

とあるように標本を大きくしていくと正規分布に近づくという定理です。

サイコロを想定してpythonで表現してみます。

numpyのrandintでランダムに1〜6の目を出すサイコロを回数分出します。

とりあえず10000回くらい振ってみましょう。

#! /usr/bin/env python

# -*- coding:utf-8 -*-

import pandas as pd
import numpy as np


print("[dice]")
print()

# サイコロの目(1〜6)をランダムにnumpy配列で出力
pip = np.random.randint(1, 7, 10000)

# 作られた配列の先頭を表示
print(pip[:10])
print()
print(f"平均値: %f" % pip.mean())
print()

そしてmatplotlibのヒストグラムで分布を見てみましょう。

#ヒストグラムでプロット
import matplotlib.pyplot as plt
import japanize_matplotlib

plt.title("サイコロ")
plt.xlabel("出た目")
plt.ylabel("出た回数")
plt.hist(pip, bins=6, ec="k")
plt.show()

平均値: 3.502500
1~6までほぼ同じ回数出てるのが分かります。
期待値は(1+2+3+4+5+6) / 6 = 7/2 = 3.5なので平均値もほぼ合ってます。
サイコロ1つなら感覚的にもつかみやすいでしょう。

次に2個のサイコロを振ってみます。



import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
#最瀕値を出すために使用
import statistics

#振る回数
roll = 10000

#1つ目のサイコロ
pip = np.random.randint(1, 7, roll)
#2こ目のサイコロの
pip2 = np.random.randint(1, 7, roll)

print("[dice]")
print()
#先頭10回分の目
print(pip[:10])
print(pip2[:10])

sm = pip + pip2
print()
print(f"平均値: %f" % sm.mean())
print(f'最瀕値: %f' % statistics.mode(sm))

plt.title("サイコロ")
plt.xlabel("出た目")
plt.ylabel("出た回数")
plt.hist(sm, bins=11, ec="k")

plt.show()

平均値: 7.044900

最瀕値: 7.000000


サイコロを2つにすると足した7が一番多い山のような形になることが分かります。




振るサイコロ6個の目の合計ではどうでしょう?

サイコロ6つだと、出る目は6の6乗の46656とおりになるので、それ以上回数を振らないとまばらな結果になりそうです。

10万回くらい振ってみましょう

#! /usr/bin/env python

# -*- coding:utf-8 -*-

#
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
#最瀕値を出すために使用
import statistics

#振る回数
roll = 100000

# ndarrayの初期化
sm = np.zeros(roll)

print("[dice]")


for i in range(6):
    pip = np.random.randint(1, 7, roll)
    
    #出ための先頭10回
    print(pip[:10])
    sm += pip

print()
print(f"平均値: %f" % sm.mean())
print(f"最瀕値: %f" % statistics.mode(sm))
print()
#出ための合計の種類
print(np.unique(sm))


plt.figure(figsize=(10, 8))
plt.title("サイコロ")
plt.xlabel("出た目の合計")
plt.ylabel("出た回数")
plt.grid()
plt.hist(sm, bins=31, ec="k")

plt.show()

平均値: 21.013420

最瀕値: 21.000000



ほぼ正規分布に近づきました。

標本を大きくすれば正規分布に近づいていくという中心極限定理が感覚的につかめました。

2022年11月19日土曜日

form要素のinput type="button" と button要素のJavaScriptでの挙動の違い

 フォーム要素でボタンを使用する場合、現在ではbutton要素が推奨されてます。

理由はそこら中で書いてありますが、CSSで疑似要素が使えたり、デザイン性で柔軟だからです。

ここではJavaScriptによる違いを書きます。


まずは、何もないbutton要素

  

何も指定しないと、type="submit"と同じ送信になり、formのaction属性と同じになります。

なのでtype="button"にしたい場合は属性を書かなければなりません。

button要素の中のテキストを取得したい場合は、input要素のようにvalueでは取得できません。button要素の文字は、タグで挟まれてるのでtextContentで取得します。


button要素でカウンターを作る例

  

冷静に考えたら分かりますね。

submitで値を送信したい場合は、そのままvalue属性が書けます。

2022年9月15日木曜日

PythonのMeCab使用でエラーが出る

 MeCabは日本語形態素解析システムの主要パッケージで、日本語解析によく使われます

しかしバージョンが合ってないとただimportしただけではエラーが出ます。


Python3の pip install mecab でエラーが出た場合は



$ pip install mecab-python3

$ pip install unidic-lite


でインストールしてください。


unidic-liteは辞書です。


----------------------------------------------------------


Failed initializing MeCab. Please see the README for possible solutions:


    https://github.com/SamuraiT/mecab-python3#common-issues


If you are still having trouble, please file an issue here, and include the

ERROR DETAILS below:


    https://github.com/SamuraiT/mecab-python3/issues


issueを英語で書く必要はありません。


------------------- ERROR DETAILS ------------------------


のようなエラーが出た場合は辞書がインストールされてません

2022年8月28日日曜日

線形回帰を求める(2)

前回は散布図で、都道府県別人口と平均年収をプロットしました。 後は線形回帰分析するだけです。 線形回帰はsklearnライブラリを使用することで簡単に分析できます。
from sklearn.linear_model import LinearRegression

X = df3[['人口']]
y = df3['平均年収']

# モデルの作成
model = LinearRegression()

model.fit(X, y)


print("傾き: %f" % model.coef_)
print("切片: %f" % model.intercept_)
print()
print("決定係数: %f" % model.score(X, y))


y = ax + b 

傾き: 0.124986 
切片: 4101341.031155 

決定係数: 0.605080


sklearnを使うだけで、簡単に単回帰分析出来ます。

predictを使い回帰直線を引きます。

人口と平均年収の関係はありそうですね。

predict = model.predict(X)

plt.plot(x, predict, color="coral")

全コード
#! /usr/bin/env python

# -*- coding:utf-8 -*-

#
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.linear_model import LinearRegression

#日本円表示を数値に
def currencyToNumber(val):
    # 万と千以下に分ける
    man, sen = val.split("万")

    #円を取り除き,千以下を0埋め
    sen = sen.replace("円", "")
    sen = sen.zfill(4)

    man += sen
    return int(man)
    

# 数値のカンマを取り除く
def dropComma(val):
    val = val.replace(",", "")

    return float(val)

data1 = "../data/prefecture1.csv"
data2 = "../data/income_pref.csv"

df1 = pd.read_csv(data1)
df2 = pd.read_csv(data2)

print(df1.head())
print()
print(df2.head())
print()

df3 = pd.merge(df1, df2)

print(df3.head())
print()

df3['平均年収'] = df3['平均年収'].apply(currencyToNumber)
df3['人口'] = df3['人口'].apply(dropComma)

x = df3['人口']
X = df3[['人口']]
y = df3['平均年収']


# モデルの作成
model = LinearRegression()

model.fit(X, y)


print("傾き: %f" % model.coef_)
print("切片: %f" % model.intercept_)
print()
print("決定係数: %f" % model.score(X, y))

pref_name = df3['都道府県']

plt.figure(figsize=(16, 10))

predict = model.predict(X)


plt.title("人口と平均年収のグラフ", fontsize=24)
plt.scatter(x, y)
plt.grid()

plt.xlabel("人口(人)", fontsize=18)
plt.ylabel("平均年収(円)", fontsize=18)

plt.plot(x, predict, color="coral")

for i, pref in enumerate(pref_name):
    plt.annotate(pref, (x[i], y[i]))

nums = plt.gca().get_yticks()
plt.gca().set_yticklabels(['{:,.0f}'.format(i) for i in nums])
nums = plt.gca().get_xticks()
plt.gca().set_xticklabels(['{:,.0f}'.format(i) for i in nums])

out = "img/prefecture_data1.png"
plt.savefig(out)
plt.show()

線形回帰を求める(1)

 色々なデータに触れると、相関関係があるのか確かめたくなります。

最も簡単な分析が線形回帰でよく使われています。

今回は、こちらのデータを使い都道府県と平均年収の関係を使って簡単なテストをしてみます。

import pandas as pd

data1 = "prefecture1.csv"
data2 = "income_pref.csv"

df1 = pd.read_csv(data1)
df2 = pd.read_csv(data2)

print(df1.head())
print(df2.head())

  都道府県 県庁所在地          人口          面積     人口密度
0  北海道   札幌市  5,181,776   83,424.41    66.08 
1  青森県   青森市  1,221,288    9,645.62   126.62 
2  岩手県   盛岡市  1,196,277   15,275.01    78.32 
3  宮城県   仙台市  2,290,036    7,282.29   314.47 
4  秋田県   秋田市    944,902   11,637.52    81.19 

   順位  都道府県       平均年収
0  1位   東京都  584万9300円
1  2位  神奈川県  541万5500円
2  3位   愛知県   524万400円
3  4位   大阪府  511万8600円
4  5位   兵庫県  495万2100円


データフレームをマージし、数値で処理出来るようにコンマなど取り払います。
説明変数xは人口、目的変数yは平均年収の関係を調べましょう。



# データのマージ
df3 = pd.merge(df1, df2)



#日本円表示を数値に
def currencyToNumber(val):
    # 万と千以下に分ける
    man, sen = val.split("万")

    #円を取り除き,千以下を0埋め
    sen = sen.replace("円", "")
    sen = sen.zfill(4)

    man += sen
    return int(man)
    

# 数値のカンマを取り除く
def dropComma(val):
    val = val.replace(",", "")

    return float(val)
    
    
    
# 関数を適用して数値にする
df3['平均年収'] = df3['平均年収'].apply(currencyToNumber)
df3['人口'] = df3['人口'].apply(dropComma)

# プロットする場合はSeriesで小文字のx
x = df3['人口']
# 線形回帰する場合はDataFrameで大文字のX
X = df3[['人口']]

# 目的変数y
y = df3['平均年収']


出来上がったデータを散布図としてプロットします。

import matplotlib.pyplot as plt
import japanize_matplotlib


# 県名が見やすいように大きめのグラフに
plt.figure(figsize=(16, 10))


plt.title("人口と平均年収のグラフ", fontsize=24)

#散布図
plt.scatter(x, y)
plt.grid()

plt.xlabel("人口(人)", fontsize=18)
plt.ylabel("平均年収(円)", fontsize=18)

# 点それぞれに中訳を入れる annotate
pref_name = df3['都道府県']

for i, pref in enumerate(pref_name):
    plt.annotate(pref, (x[i], y[i]))

# 数値が大きいと指数表示になるので、分かりやすく整数表示にする
nums = plt.gca().get_yticks()
plt.gca().set_yticklabels(['{:,.0f}'.format(i) for i in nums])
nums = plt.gca().get_xticks()
plt.gca().set_xticklabels(['{:,.0f}'.format(i) for i in nums])


plt.show()