ヒーローを分類してPythonが王者を連れて行くのを見て

7385 ワード

王の栄光はこんなに長くなったのに,まだ王になっていないのか.ハハハ、見て、英雄に対する理解が足りないのではないでしょうか.まだ英雄の分類がよくないのではないでしょうか.今日は英雄の分類を見てみましょう.
テクノロジースタック
一、EMクラスタリングの概要
二、ネット上のヒーローの初期属性値を取得する
三、円グラフを作る
EMクラスタリングの概要
EMの英語名はExpectation Maximizationで、最大期待アルゴリズムとも呼ばれます.
統計計算において、最大期待(EM)アルゴリズムは、確率(probabilistic)モデルにおいてパラメータの最大尤度推定または最大後験推定を探すアルゴリズムであり、確率モデルは観測不可能な隠蔽変数(Latent Variable)に依存する.
最大期待アルゴリズムは2つのステップで交互に計算され、第1のステップは期待(E)を計算し、隠蔽変数に対する既存の推定値を利用して、その最大尤度推定値を計算する.第2ステップは最大化(M)であり,Eステップで求めた最大尤度値を最大化してパラメータの値を計算する.Mステップで見つけたパラメータ推定値を次のEステップ計算に用い,このプロセスは絶えず交互に行われる.
ここではpython学習者が集まる場所で、大牛の質疑応答があり、資源共有があります.pythonプログラミングを学びたい人、転職したい人、大学生、仕事で自分の能力を高めたい人、勉強している仲間は勉強に参加してください.
英雄集団を行なう.
sklearnライブラリのEMクラスタリングアルゴリズムフレームワークを用いてGaussハイブリッドモデルを採用
from sklearn.mixture import GaussianMixture


いくつかの主要なパラメータの意味は次のとおりです.他のパラメータは関連ドキュメントを表示できます.
  • n_components:ハイブリッドGaussモデルの個数、すなわち所望のクラスタリング個数、デフォルトは1
  • covariance_type:完全共分散行列(要素はすべてゼロではありません)、同じ完全共分散行列(HMMが使用します)、対角共分散行列(非対角はゼロ、対角はゼロ)、球面共分散行列(非対角はゼロ、対角は完全に同じ、球面特性)、デフォルトの「full」完全共分散行列
  • max_iter:最大反復数、デフォルト100
  • GMMクラスタリングは次のように構築できます.
    #    GMM   
    gmm = GaussianMixture(n_components=20, covariance_type='full')
    
    

    次の構造のデータがあります.
    [画像アップロード中...(image-5 dab 6 a-1562219826453-6)]
    関連するプロパティが非常に多く、初期のプロパティ設定は次のとおりです.
    feature = ['1     ', '15     ', '    ',
               '1   ', '15   ', '     ', '1     ',
               '15     ', '        ', '    ',
               '1  5   ', '15  5   ', '1     ',
               '15     ', '      ', '1      ',
               '15  5   ', ' /  ?', '  ', '  ', '      ']
    
    

    属性次元ダウン
    まず、熱力図によって、どの属性が強いかを判断し、一意の属性のみを保持することができます.
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    corr = data[feature].corr()
    plt.figure(figsize=(14, 14))
    sns.heatmap(corr, annot=True)
    plt.show()
    
    

    [画像アップロード中...(image-23849-1562219826453-5)]
    ここで、「レベル1最大法力」、「レベル15最大法力」、「最大法力成長」は、強い相関があり、属性フィルタを作成できます.最終的に保持される属性は次のとおりです.
    features_remain = ['15   ', '15     ',
                       '15     ', '15     ',
                       '15  5   ', '15  5   ', '  ',
                       '    ', ' /  ?']
    
    

    データの正規化
    攻撃範囲フィールド([近接/リモート?])を0と1に変換
    data_new[' /  ?'] = data_new[' /  ?'].map({'  ': 1, '  ': 0})
    
    

    EMクラスタリング計算
    ガウスブレンドモードを採用し、生成したカテゴリをcsvファイルに書き込む
     #    GMM   
     gmm = GaussianMixture(n_components=20, covariance_type='full')
     gmm.fit(data_new)
    
     #     
     prediction = gmm.predict(data_new)
     # print(prediction)
    
     hero_data.insert(0, '  ', prediction)
     hero_data.to_csv('hero_out.csv', index=False, sep=',', encoding='gb18030')
    
    

    円グラフ出力
    各ヒーローのグループ化状況をより直感的に表示するには、まずデータを取り出した「グループ」と「名前」の2つのフィールドを可視化し、「グループ」フィールドをグループ化するために円グラフを使用します.
    df = hero_data[['  ', '  ']]
    grouped = df.groupby(['  '])
    
    

    次にグループの数値を取り出し、pyechartsで円グラフを描きます.
     from pyecharts import Pie
    
     k = []
     for name, group in grouped:
         k.append({name: list(group['  '].values)})
    
     kk = []
     for i in k:
         for k, v in i.items():
            kk.append(v)
    
    length = []
    key = []
    for i in kk:
        key.append(str(i))
        length.append(len(i))
    pie = Pie('         ', title_pos='center')
    pie.add("", key, length,
            is_label_show=True, legend_pos="bottom", legend_orient="vertical",)
    pie.render()
    
    

    [画像アップロード中...(image-3 be 250-1562219826453-4)]
    ヒーローの初期属性をキャプチャ
    より完全なヒーローデータを得るには、ネット上で捕まえる必要があります.そうすれば、ヒーローの数が最新であることを保証することができます.ここで私が使っているのはdbです.18183.com/ウェブサイトのデータ、ページは以下の通りです.
    [画像アップロード中...(image-9 bb 357-1562219826453-3)]
    [画像アップロード中...(image-ce 0 f 68-1562219826453-2)]
    ヒーローページURLを取得
    BeautifulSoupを使用して、classがmod-iconlistのul要素にナビゲートします.保存されているのは各ヒーローのページです.
        url = 'http://db.18183.com/'
        url_list = []
        res = requests.get(url + 'wzry').text
        content = BeautifulSoup(res, "html.parser")
        ul = content.find('ul', attrs={'class': "mod-iconlist"})
        hero_url = ul.find_all('a')
        for i in hero_url:
            url_list.append(i['href'])
    
    

    詳細のキャプチャ
    検索したURLリストをループし、各ヒーローの詳細をキャプチャします.
         base_url = 'http://db.18183.com/'
         detail_list = []
         for i in url:
             # print(i)
             res = requests.get(base_url + i).text
             content = BeautifulSoup(res, "html.parser")
             name_box = content.find('div', attrs={'class': 'name-box'})
             name = name_box.h1.text
             hero_attr = content.find('div', attrs={'class': 'attr-list'})
            attr_star = hero_attr.find_all('span')
            survivability = attr_star[0]['class'][1].split('-')[1]
            attack_damage = attr_star[1]['class'][1].split('-')[1]
            skill_effect = attr_star[2]['class'][1].split('-')[1]
            getting_started = attr_star[3]['class'][1].split('-')[1]
            details = content.find('div', attrs={'class': 'otherinfo-datapanel'})
            # print(details)
            attrs = details.find_all('p')
            attr_list = []
            for attr in attrs:
                attr_list.append(attr.text.split(':')[1].strip())
            detail_list.append([name, survivability, attack_damage,
                                skill_effect, getting_started, attr_list])
    
    

    csvファイルに保存
    Openファイル、対応するリストフィールドを格納
         with open('all_hero_init_attr.csv', 'w', encoding='gb18030') as f:
             f.write('    ,    ,    ,    ,    ,    ,    ,    ,'
                     '    ,    ,     ,    ,     ,  ,      ,      ,    ,    ,'
                     '    ,    ,    ,    ,    ,  ,    ,    
    ') for i in details: try: rowcsv = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format( i[0], i[1], i[2], i[3], i[4], i[5][0], i[5][1], i[5][2], i[5][3], i[5][4], i[5][5], i[5][6], i[5][7], i[5][8], i[5][9], i[5][10], i[5][11], i[5][12], i[5][13], i[5][14], i[5][15], i[5][16], i[5][17], i[5][18], i[5][19], i[5][20] ) f.write(rowcsv) f.write('
    ') except: continue

    データクリーンアップ
    このサイトはあまり意図していない可能性がありますので、図のように2つのパーセントと空の場合があります.
    [画像アップロード中...(image-ced 2 dd-1562219826452-1)]
    だから処理する必要があります.
    2つのパーセンテージについては、notepad++を直接使用してすべての%%を単%に置き換えるとよい
    空のフィールドの場合は、次のコード処理を使用して0に入力します.
    #       0
    data_init = data_init.fillna(0)
    
    

    完了
    データの規範化については、GMMクラスタリングと餅図の提示は、いずれも前と類似しており、これ以上説明しないで、餅図の効果を見てみましょう.
    [画像アップロード中...(image-13 f 8 ec-1562219826452-0)]
    この2枚の円グラフを通して、あなたの手の不自由な欠点を一気に高めることはできませんが、英雄の分類を明確にして、王者に一歩近づいたのではないでしょうか.