人工知能-プログラミング-Fizz Buzz


タイトルの説明:
プログラムを書いて遊びに来なさいこれはゲームです.プレイヤーは1から100まで数え、数字が3で割り切れると「fizz」と呼び、5で割り切れると「buzz」と呼び、両方が満足すれば「fizzbuzz」と呼び、そうでなければ直接数字を言う.このゲームはまるで:
1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 …
一.従来の方法のプログラミング
def fizz_buzz(num):
    if num % 3 == 0 and num % 5 == 0:
        return "fizz buzz"
    elif num % 3 == 0:
        return "fizz"
    elif num % 5 == 0:
        return "buzz"
    else:
        return str(num)


for i in range(100):
    print("%d : %s" % (i+1, fizz_buzz(i+1)))
1 : 1
2 : 2
3 : fizz
4 : 4
5 : buzz
.......
96 : fizz
97 : 97
98 : 98
99 : fizz
100 : buzz

メリット:
  • 現在の問題を100%正しく解決する
  • コード行数が少ない
  • データに依存しない
  • 解釈可能
  • 二.AIプログラミング
    機械学習には3つのステップが必要です.
  • 特徴工程は、できるだけデータ特徴を抽出し、
  • を数字で表す.
  • データトレーニング、データの観察分析を行い、適切なアルゴリズム
  • を見つけた.
  • モデル予測、モデルの精度を分析し、最適化する
  • KNN分類アルゴリズム:
    
    import numpy as np
    from sklearn.neighbors import KNeighborsClassifier
    
    """
    knn    : 
     
    """
    
    #    :      
    
    #            
    #             ,         
    #        : 0, 1, 2, 3
    #  :       ,               
    def fizz_buzz_label_data(num):
        if num % 3 == 0 and num % 5 == 0:
            return 0
        elif num % 3 == 0:
            return 1
        elif num % 5 == 0:
            return 2
        else:
            return 3
    
    
    #       
    #        ,               
    #                :
    # 1:         [1, 1] -> 3
    # 2:         [2, 2] -> 3
    # 3:         [0, 3] -> 1
    # 4:         [1, 4] -> 3
    # 5:         [2, 0] -> 2
    # ........
    # 15:       [0, 0] -> 0
    def feature_engineer(num):
        return [num % 3, num % 5]
    
    
    #          ,             ,             
    #        101- 200         
    train_data_x = np.array([feature_engineer(i) for i in range(101, 201)])
    train_data_y = np.array([fizz_buzz_label_data(i) for i in range(101, 201)])
    
    #    :      
    
    #          k    5,      ,           
    model = KNeighborsClassifier(n_neighbors=5)
    model.fit(train_data_x, train_data_y)
    
    #    :         
    
    #      
    
    test_data_x = np.array([feature_engineer(i) for i in range(1, 101)])
    test_data_y = np.array([fizz_buzz_label_data(i) for i in range(1, 101)])
    
    #         
    predict_y = model.predict(test_data_x)
    print("         : %s" % predict_y)
    
    #        
    model_score = model.score(test_data_x, test_data_y)
    print("     : %s" % model_score)
    
    
    #      
    def predict_num(num):
        num_label = model.predict(np.array([feature_engineer(num)]))[0]
        if num_label == 0:
            return "fizz buzz"
        elif num_label == 1:
            return "fizz"
        elif num_label == 2:
            return "buzz"
        elif num_label == 3:
            return str(num)
    
    
    for i in range(100):
        print("%d : %s" % (i + 1, predict_num(i + 1)))
    
             : [3 3 1 3 2 1 3 3 1 2 3 1 3 3 0 3 3 1 3 2 1 3 3 1 2 3 1 3 3 0 3 3 1 3 2 1 3
     3 1 2 3 1 3 3 0 3 3 1 3 2 1 3 3 1 2 3 1 3 3 0 3 3 1 3 2 1 3 3 1 2 3 1 3 3
     0 3 3 1 3 2 1 3 3 1 2 3 1 3 3 0 3 3 1 3 2 1 3 3 1 2]
         : 1.0
    1 : 1
    2 : 2
    3 : fizz
    4 : 4
    5 : buzz
    6 : fizz
    ........
    98 : 98
    99 : fizz
    100 : buzz
    

    特徴:
  • 試験精度は100%
  • ではない
  • コード行数が多い
  • 依存データ
  • 解釈不可能