#!/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はなにを行っているのでしょうか?
教えてください。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/14 01:49
2016/04/14 11:18