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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 2.7

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

Q&A

解決済

2回答

1930閲覧

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

gik

総合スコア152

Python 2.7

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

0グッド

0クリップ

投稿2016/04/13 16:07

編集2016/04/13 16:09

#!/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はなにを行っているのでしょうか?
教えてください。
よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

投稿2016/04/13 18:27

編集2016/04/13 18:34
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gik

2016/04/14 01:49

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

2016/04/14 11:18

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

0

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/13 19:15

sharow

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gik

2016/04/14 01:51

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

2016/04/14 02:49

reduce(lambda n, o: n + 1 if o else n, results, 0) この式でつかわれているのはreduce、lambda、条件演算(Conditional Expressions)の3つです。それら個々について調べてみてはどうでしょう。 これらをどう組み合わせるかは使う人の自由の範疇ですから、この3つの入った例をピタリと公式のドキュメントで探すのは困難かと思います。
gik

2016/04/14 11:17

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問