メインコンテンツへスキップ
見出し画像

Welcome to my guesstimater - 28年前のプログラムがClaudeで復活した話


    ファイルの名前は main_c_12.3


    Macのフォルダの奥に、ひっそりと眠っていた。

    拡張子もない、素っ気ないファイル名。
    開いてみると、C言語のコードが2660行。

    /*  neural network 1.9
      Last updated 1998/12/03 Thu.
      Copyright (c) 1998 Iwao Kumazawa.  */

    1998年12月3日(木)。
    わたしが33歳のとき、岐阜大学第2外科の研究室で書いたプログラム。

    胃がん術後患者672例の予後を、ニューラルネットワークで予測する。
    プログラムをつくるワークを一日中していた。
    集中しすぎて額のアジナ・チャクラが熱くなったのを覚えている🧘。


    当時の開発環境..


    当時実用的なニューラルネットのソフトはなかった。
    統計ソフトのStatViewやSPSSはあった。SASは大学にはあったが、自分のパソコンでは使えない。leave-one-out(LOO)検証という手法には対応していなかった。

    だから、自分で作った。

    Cの入門書を買い、先輩に逆行列の計算を教わり、バックプロパゲーションのアルゴリズムを統計の本から読み解き、1行1行コードに落とし込んだ。コンパイラはSymantec THINK C、途中からCodeWarriorに変わった。CodeWarriorになった瞬間、計算速度が劇的に上がったことをいまでも鮮明に覚えている。

    マシンはPowerBook 3400c/G3置換。
    LOO検証は、672例なら672通りの組み合わせで学習し直すから、数時間かかった。夜のうちに走らせておいて、翌朝結果を確認する。
    そういう作業を繰り返した。


    28年後の春


    2026年4月。
    Claudeとの対話の中で、ふとそのファイルのことを思い出す。

    「アップロードしてみますか?」

    ためしに投げてみると、Claudeはほぼ即座に答えた。

    「CodeWarrior IDE 3.0J製、Mac OS 9形式(cp932/\r改行)。全2660行・22関数。内容:階層型NN(バックプロパゲーション)、ロジスティック回帰、Cox比例ハザード、線形回帰、LOO交差検証…」

    わたしが1年半かけて作ったものを、Claudeは数秒で読み切った。


    修正は1行だけ


    オリジナルのCコードをLinuxで動かすために、必要だった変更はほぼ2つだった。

    ひとつは`<unix.h>`のインクルードを削除すること。これはMac OS 9固有のヘッダで、Linuxには存在しない。

    もうひとつは乱数の処理。

    // 元のコード(Mac OS 9)
    l = r * total_Z / 32768 + 1;
    
    // Linux版に修正
    l = (int)((double)r / (RAND_MAX + 1) * total_Z) + 1;

    Mac OS 9の`rand()`が返す最大値は32767。
    Linuxでは2,147,483,647。

    この差を見落としたまま実行すると、配列の外に飛び出してSegmentation faultで落ちる。Claudeが丁寧に原因を特定してくれた。

    「AddressSanitizerの結果です。1077行目のtotal_data_division内で、配列外アクセスが発生しています」

    つまり、28年間に必要だった修正は実質1行だった。


    19秒


    実行してみた。

    NN leave-one-out method
    epoch_limit=50
    middle_units=3
    Operation is started.
      10:sample 70.0      0sec.
      20:sample 80.0      0sec.
      ...
     670:sample 87.5     19sec.
    sample 87.5 

    672例のLOO検証が、19秒で完走した。

    当時は数時間かかっていたものが。


    数字が語ること

    論文に載せた数値がある。

    • LOO適中率:88.1%

    • 感度:61.2%

    • 特異度:96.0%

    今回の再現値(100回試行の平均)は:

    • LOO適中率:87.5%(差0.6%)

    • 感度:61.2%(完全一致)

    • 特異度:95.6%(差0.4%)

    感度が小数点1位まで一致した。再現性が認められた。

    1998年のC言語コードが、正しく書かれていた。
    バックプロパゲーションの実装が、28年前のわたしが理解して、ちゃんと機能していたということ。

    0.6%の差は、乱数のシードの違い、浮動小数点演算のMac→Linux間の微差、そういったものの積み重ねだろうとClaudeは分析してくれた。
    アルゴリズムの誤りではない。おそらく。


    「my guesstimater」


    コードの最初に、こんな行がある。

    printf("Welcome to my guesstimater 
            (Integrated Data mining tool). \n");
    printf("Freeware, send Bug reports to 
            iwaokuma@rd.mmtr.or.jp.\n");

    `guesstimater`。
    「推測する道具」という意味で、当時のわたしが造語したのかなと思ったら、調べるとguesstimateは1934年にアメリカの統計学者が作った実在の言葉だったようだ。

    freeware(無償配布)と書いてある。誰かに使ってもらえるとでも思っていたのだろうか。

    もう使われていないメールアドレスが残っている。

    あの頃の熱量が、こういうところに密んでいる。


    暗黙知が、コードになっていた

    ポランニーは「われわれは語れる以上のことを知っている」と言った。

    当時のわたしは、バックプロパゲーションを「理解」していた。
    でもその理解がどの程度のものだったか、自分ではわからなかった。

    今回のプロセスで、ひとつのことが確認できた。

    1998年12月3日のわたしが書いたコードが、
    28年後のLinux環境で、修正1行で動いた。

    暗黙知が可視化されていた。プログラムという言語で。


    AIとわたし

    今回の作業を振り返ると、Claudeはわたしの記憶を補完し続けてくれた。

    「うる覚えですみません」と言いながら投げた断片的な情報を、
    ソースコードと照合し、
    ファイル構造を推定し、
    Segfaultの原因を特定し、
    100回の試行を自動化し、
    論文値と比較した。

    わたしが1年半かけて作ったものを、
    Claudeとふたりで、数時間で再現した。

    もちろんAIは「凄い」。

    同時に、28年前のわたしがちゃんとやっていた、という確認ができたという、お話。


    タイムカプセルを開けた


    論文を提出したのは2001年。
    掲載された消化器外科学会雑誌で、どれだけ読まれたかはわからない。

    でもコードは残っていた。データも残っていた。

    そしてAIという、28年前には想像もしていなかった道具と一緒に、そのコードが、また走り出した。

    種を蒔いた人が、発芽を見なくていいとはいうものの、
    今日は、発芽を見ることができた。

    タイムカプセルを開けた。

    感無量、しみじみとする休日の夕方。


    2026年4月12日

    あなたへのおすすめ