質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Python 2.7

    1305questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

pythonのreduce関数のラムダ式がわからない 

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 739

gik

score 136

!/usr/bin/env python

 -*- coding: utf-8 -*-

try:
    from functools import reduce
except ImportError:
    pass

import numpy as np
from sklearn import datasets
from sklearn.cross_validation import LeaveOneOut

def distance(p1, p2):
    # N 次元 (配列) で 2 点間のユークリッド距離を求める
    return np.sum((p1 - p2) ** 2)

def nearest_neighbor(train, train_targets, point):
    # point と train の各点のユークリッド距離を測る
    distances = np.array([distance(t, point) for t in train])
    # 距離が最小 (再近傍) の点を得る
    nearest_point = distances.argmin()
    # 再近傍の点の種別を判定結果として返す
    return train_targets[nearest_point]

def main():
    iris = datasets.load_iris()

    # 特徴量の入ったデータ (4 次元)
    features = iris.data
    # データと品種の対応
    targets = iris.target

    # leave-one-out 交差検定
    loo = LeaveOneOut(len(features))
    results = []
    for train_indexes, test_indexes in loo:
        train = features[train_indexes]
        test = features[test_indexes]
        # k近傍法で判定する
        answer = nearest_neighbor(train, targets, test)
        # 正解か不正解かの判定
        right = targets[test_indexes]
        results.append(answer == right)

    # 結果表示
    N = len(features)
    correct = reduce(lambda n, o: n + 1 if o else n, results, 0)
    msg = '正解: {0}/{1}'.format(correct, N)
    print(msg)
    failed = reduce(lambda n, o: n + 1 if not o else n, results, 0)
    msg = '不正解: {0}/{1}'.format(failed, N)
    print(msg)
    correct_rate = (float(correct) / N) * 100
    msg = '正解率: {0}%'.format(correct_rate)
    print(msg)

if name == 'main':
    main()

ここのreduce関数のラムダ式がなにをやっているのかよくわかりません。
oとnはなにを行っているのでしょうか?
教えてください。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

functools.reduce組み込み関数のreduceと同じでアキュムレータを作る関数ですね。最後の引数は初期値です。省略すると、resultのインデックス0のbooleanデータが入ってしまうので指定しています。
lamda式の第一引数はアキュムレータ関数になっていて,正解の条件分岐では,正解のデータだったらtrueなので,アキュムレータを+1して次のデータに,不正解だったらfalseを返しているので何もせずにアキュムレータを返して次のデータに進むということをやっていて,不正解だとその逆の対応になっています。
要は,正解データの数と不正解データの数を数えてるって感じですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/14 10:49

    すいません。
    理解はできたんですが、このことをかいてあるサイトありますか?なにでぐぐればいいでしょうか?

    キャンセル

  • 2016/04/14 20:18

    理解できました。ありがとうございます。

    キャンセル

+1

reduceについてはtkowさんの説明どおりです。

やってることを紐解いてみると理解しやすいでしょう。

correct = 0
for i in results:
    if i == True:
        correct += 1


こういうことですよね。

・・ただ、普通は

correct = sum(results)


でいいんじゃないかと思います。Python2でもPython3でも1 == TrueTrueになりますし、True + Trueは2になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/14 10:51

    すいません。
    理解はできたんですが、このことをかいてあるサイトありますか?なにでぐぐればいいでしょうか?

    キャンセル

  • 2016/04/14 11:49

    reduce(lambda n, o: n + 1 if o else n, results, 0)

    この式でつかわれているのはreduce、lambda、条件演算(Conditional Expressions)の3つです。それら個々について調べてみてはどうでしょう。

    これらをどう組み合わせるかは使う人の自由の範疇ですから、この3つの入った例をピタリと公式のドキュメントで探すのは困難かと思います。

    キャンセル

  • 2016/04/14 20:17

    すいません。両方の方にベストアンサーしたかったんですが、回答丁寧にしていただき
    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 2.7

    1305questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。