カテゴリー別アーカイブ: めざせ1万PV/day

最急降下法

最近流行りの機械学習でも使用される「最急降下法」について、最も簡単なモデルに対して実験してみた結果を記述していおく。なお、英語は 「Gradient descent」,「 steepest descent」。「勾配法」とも呼ばれる。

モデル

  • 最も単純な1段のニューラルネットワーク
  • 入力は X1, X2 の2つのみ
  • それぞれの入力係数は W1, W2
  • バイアス様に W0 も用意し、X0 は常に1とする
  • y = ΣW*X とし、活性化関数は使用しない

学習

  • 教師あり学習とし、教師値は t = A + B*X1 + C*X2 とする
    • A, B, C は定数
  • ロス関数は E = 1/2 * (y – t)^2 とする
    • いわゆる最小自乗誤差
    • 1/2 を乗じているのは微分したときに (y-t) となりすっきりするから
  • 入力から出力値を計算し、誤差を求め、それを元に係数 W0, W1, W2 を最急降下法により修正する
  • Wi について、∂E/∂Wi を計算し、それに定数 α をかけたものを Wi から減ずる(これを「最急降下法」と呼ぶ)
    • Wi -= α * ∂E/∂Wi
    • α は 0.01 などの小さい値。大きければ収束が速いが、発散する場合がある
  • ∂E/∂Wi は y を用いた 微分 の連鎖律により計算する
    • ∂E/∂Wi = ∂E/∂y * ∂y/∂Wi
    • ∂E/∂y = y – t, ∂y/∂Wi = Xi なので
    • ∂E/∂Wi = (y – t) * Xi

Downloader

  • include “network/CCDownloader.h”
  • メンバ変数に以下を追加
    • std::unique_ptr m_downloader;
  • メンバ変数初期化
    • m_downloader.reset(new network::Downloader());
  • 各種ハンドラ設定

// define progress callback

m_downloader->onTaskProgress = [this](const network::DownloadTask& task,
int64_t bytesReceived,
int64_t totalBytesReceived,
int64_t totalBytesExpected)
{
log(“”);
};

// define success callback
m_downloader->onDataTaskSuccess = [this](const cocos2d::network::DownloadTask& task,
std::vector& data)
{
log(“”);
};
m_downloader->onFileTaskSuccess = [this](const cocos2d::network::DownloadTask& task)
{
log(“”);
this->doOutput(“download succeded\n”);
};
// define failed callback
m_downloader->onTaskError = [this](const cocos2d::network::DownloadTask& task,
int errorCode,
int errorCodeInternal,
const std::string& errorStr)
{
log(“”);
this->doOutput(“download failed\n”);
};

  • ダウンロード処理開始
string dst = FileUtils::getInstance()->getWritablePath() + g.m_projectName + ".prj/images/" + fileName;
m_downloader->createDownloadFileTask(url, dst, fileName);

Tiny BASIC v3

  • 拡張された構造化BASIC
  • 静的型付け:浮動小数点数 (# 省略可)、整数 (%)、文字列 ($)
  • グローバル変数は宣言無しに利用可能、ローカル変数は local 変数名,… で宣言
  • dim <ident>{#|%|$}[<const-exp>], ar[0] から ar[N-1] まで有効
  • goto 文無し, if <exp> then … {else …} end, while <exp> {do} … end, repeat … until <exp>, times <exp> … end, for <var>=<exp> to <exp> {step <exp>} … [next|end], break, continue
  • def <ident>(arg…) statement… end, return <exp>
  • C互換演算子, 16進数は 0x または &H
  • 関数:abs(), min(), max(), sqrt(), sgn(), rand(), sin(), cos, tan(), asin(), acos, atan2(), exp(), log(), log10(), pow(), floor(), ceil(), round()
  • 文字列関数:chr$(), left$(), right$(), mid$(), inkey$()
  • cls, locate, plot, color=<exp>
  • タートルグラフィックス:showTurtle(), hideTurtle(), forward(), back(), left(), right(), penUp(), penDown(), tcolor=<exp>
  • コマンド:new, edit, run, ls|dir, rename, remove, mkdir, cd, save, load, help, {print} <exp>{,…}
  • 画面更新:update() 関数がフレームごとにコールされる。 or sync でフレームごとに処理

cocos2d-x 3.17 Android に Admob SDK を組み込む

 

・ AdMobのライブラリをバンドル
  - app/build.gradle に以下を追加
dependencies {
    ...
    compile 'com.google.android.gms:play-services-ads:15.0.1'
}
・ パーミッション設定
  - app/マニュフェストに以下を追加
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
・ メタデータ、広告アクティビティの設定
  - AndroidManifest.xmlのapplicationタグに以下を追加
<meta-data android:name="com.google.android.gms.version"
           android:value="@integer/google_play_services_version" />
 
<activity
    android:name="com.google.android.gms.ads.AdActivity"
    android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
    android:theme="@android:style/Theme.Translucent" />
    
・ バナー広告を作成する処理
  - 以下を AppActivity.java に追加
import android.widget.LinearLayout;
import android.view.Gravity;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
.....
public class AppActivity extends Cocos2dxActivity {
    private AdView mAdView;  //  バナー広告
    .....
        // DO OTHER INITIALIZATION BELOW
        // 広告ビューのレイアウトパラメータを作成
        LinearLayout.LayoutParams adParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
 
        // 表示位置を下部中央に設定
        adParams.gravity = (Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
 
        // 広告ビューを作成
        mAdView = new AdView(this);
        mAdView.setAdSize(AdSize.BANNER);
        mAdView.setAdUnitId("ca-app-pub-XXXXXXXXXX/XXXXX");
        //mAdView.setAdUnitId(getString(R.string.banner_ad_unit_id));
 
        // テストデバイスのIDを指定してAdRequestを作成
        AdRequest adRequest = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                .addTestDevice("XXXXXXXXXX")
                //.addTestDevice(getString(R.string.test_device_id))
                .build();
 
        // 広告を読み込む
        mAdView.loadAd(adRequest);
 
        // 広告ビューをアクティビティに追加する
        addContentView(mAdView, adParams);        
    }

以上で、バナー広告が表示できる。

のだが、現状ではなぜか画面下部に表示されず、画面左上に表示されてしまう。

【自分用メモ】#数独 解がひとつだけかチェック

(webで公開されてた)数独の問題100問に対して、解がひとつだけかどうかをチェックするプログラムを書いてみた。
アルゴリズムは単純な探索を用いるものだが、セルの値をビットマップで表現しているために、重複チェックが数値を用いるものに比べるとはるかに高速だ。
また、数字を入れるときに、重複チェックを行うのではなく、数字を使用するたびに各縦横ブロックの使用済みフラグをオンにしている。
結果、100問をチェックするのに要した時間は 0.3036ミリ秒だった。ということは、約30マイクロ秒/問でチェック可能ということになる。

ちなみに、単に解を見つけるだけ(最初の解がみつかった時点で終了)の場合は、220マイクロ秒/100問だった。ひとつだけかチェックする場合の約15倍高速ということになる。

プロジェクトにファイルを追加 #cocos2d-x #AndroidStudio

・ External Buld Files/Android.mk の LOCAL_SRC_FILES 部分を以下のように修正

LOCAL_SRC_FILES := $(LOCAL_PATH)/hellocpp/main.cpp \
$(wildcard $(LOCAL_PATH)/../../../Classes/*.cpp)

・Classes 以下にソース・ファイルを追加
・プロジェクトをいったん閉じて開く
→ プロジェクト名/cpp/MyGame/プロジェクト名/Classes 以下に追加されたソースが表示される

Qt5 再入門>Hello, World (Label使用、デザイナ非使用)

次はLabelウィジェットは使用するが、デザイナを使用せずに「Hello, World」を表示する方法を見てみよう。

QMainWindow は、ウィンドウ中央に表示するウィジェットを持つ。これを「セントラル・ウィジェット」と呼び、setCentralWidget(QWidget*) で指定することができる。
なので、ui セットアップ後に、Label オブジェクトを生成し、それをセントラル・ウィジェットとして指定してやればよい。

MainWindow::MainWindow(QWidget *parent) : (略)
{
    ui->setupUi(this);
    QLabel *label = new QLabel("Hello, World");
    setCentralWidget(label);
}

演習問題

  1.  QLabel ではなく QPushButton オブジェクトを生成し、セントラル・ウィジェットに指定してみなさい。

 

Qt5 再入門>Hello, World (デザイナ・Label使用)

まずは画面に「Hello, World」を表示してみよう。
それにはいくつかの方法があるが、まずは一番簡単なLabelを使ったものを紹介する。
下図の左側のプロジェクト部分の Form を展開し、mainwindow.ui をダブルクリックする。

そうすると、下図のようなデザイン画面に切り替わるはずだ。
左にウィジェット一覧があるので、そこからテキストを表示するためのウィジェットである Labelを探す。ウィジェットはあまりに多すぎて探すのが大変なので、上部のフィルター部分に「la」と入力すると、下図のように一番下に出てくるぞ。

左側のウィジェット一覧から「Label」をドラッグし中央のフォームにドロップすると、下図の様に Labelウィジェットが画面に配置される。

次に「TextLabel」の部分をダブルクリックし、「Hello, World」とキーボードから入力し、ラベルテキストを変更しよう。

これで、プログラムは完成なので、Ctrl + R を押して、ビルド&実行すると、下図のように表示されるはずだ。

デザイナ右下のプロパティ部分で、フォントやアライメントを指定できるぞ。
下図はフォントを大きくし、左右中央揃えに変更してみたものだ。

Ctrl + R で実行すると下図のようになるぞ。

演習問題

  1.  Label ではなく PushButton を配置し、テキストを「Push Me」してみなさい。

まとめ

  • form>ui ファイルをダブルクリックすることでフォームをデザインできるぞ
  • ウィジェットを画面に貼り付けることができるぞ
  • 目的とするウィジェットを探すときはフィルターを使うと便利だぞ
  • プロパティでウィジェットの属性を変更することができるぞ

Qt5 再入門>空のプロジェクト作成

久々にQtでアプリを作ろうと思ったら、いろいろすっかり忘れていたので、自分の備忘録としてもQt5 を使ったアプリの作成方法を記述しておく。

なお、Qt のバージョンは 5.9, Qt Creator のバージョンは 4.3.1を使用する

空のプロジェクト作成

まずは「ようこそ」の上部中央の【+ 新しいプロジェクト】をクリックして、新しいプロジェクトの作成を開始する。

作成するプロジェクトの種別を指定するダイアログ(下図)が表示される。
通常アプリを作成したいのであれば、下図の様に「アプリケーション」、「Qtウィジェットアプリケーション」を選び、【選択】を押す。

次にプロジェクト名、プロジェクトファイルのパスを入力する。

次にクラス名、ファイル名等を設定できるダイアログが表示される。
通常は特に変更する必要は無い。

最後に、プロジェクト管理、概要が表示されるので、問題が無ければ【完了】を押す。

以上で、プロジェクトが生成される。

プロジェクトが作成できたら Ctrl + R を押してみよう。
下図のような空のウィンドウが表示されるはずだ。