def crossValidation(X, Y, k, kernel=np.dot): # answerを正解としてresultの正解率を計算 def accuracyRate(result, answer): return 1.0 - sum(abs(result - answer)/2) / float(len(result)) n = len(X) # データ点の個数 l = n / k # k分割したデータ点の個数 ac = 0.0 # 正解率の初期化 # k-交差検定を行い正解率を計算 for i in range(k): # l個の評価ベクトルとそのクラス testVectors = X[l*i:l*(i+1)] classForTestVectors = Y[l*i:l*(i+1)] # n-l個の訓練ベクトルとそのクラス learningVectors = np.vstack((X[:l*i], X[l*(i+1):])) classForlearningVectors = np.hstack((Y[:l*i], Y[l*(i+1):])) # 訓練ベクトルからサポートベクターを計算 svm = SVM(learningVectors, classForlearningVectors, kernel) # 学習した識別関数で評価ベクトルを識別 result = [svm.discriminate(t) for t in testVectors] # 評価結果の正解率を算出 ac += accuracyRate(result, classForTestVectors) # 正解率の平均を返す return ac / k