Python を使用した DT アルゴリズムの実装

目次

I.はじめに

2. データ例

3、DT 法の分類ステップ

4番目、Pythonの実装

5. 結果


I.はじめに

DT 法は、1988 年に中国の学者、Lin Yunmei によって提案されました。それは、周囲の岩石の安定性の動的分類に初めて適用されました。この手法の核となるアイデアは、「似たものは似たものを引き寄せる」の原理に従ってサンプルや指標を分類する、多変量統計分析における動的クラスタリング手法から来ています。動的クラスタリングの基本的な考え方は、すべてのサンプルを最も近いカテゴリに分類する必要があるということです。まず、サンプルの基本特性、つまり形成する「クラス」の中心に応じて複数の凝集点を与え、各サンプルから凝集点までの距離を計算し、最も近いサンプルに分類します。凝集点を設定して大まかな初期分類を形成し、その後、特定の原理に従って、分類が妥当になるまで初期分類が調整され、分類結果が出力されます。分類を調整するプロセスでは、サンプル間の距離誤差が常に補正され、誤差が許容範囲に達すると、比較的正確な結果が得られます。修正を繰り返す過程で、サンプルのレベルを動的に調整することができ、最初の分類から変更することができます。これは、一度特定のクラスに分類されたサンプルを変更しない静的分類方法とは明らかに異なります。 。

2. データ例

ロック名 圧縮強度Rc ( MPa ) かさ密度ρ ( g/cm 3 ) フル係数 爆発原単位q ( kg/m 3 )
放射性珪岩 226.76 2.94 0.18 0.88
細粒角閃岩 153.6 3.03 0.2 0.76
花崗岩 106.05 2.69 0.21 0.59
ペグマタイト 95.46 2.69 0.19 0.59
輝緑岩 69.58 3.01 0.15 0.6
緑泥石角閃岩 78.17 2.97 0.38 0.77
ヘマタイト磁石 クォーツァイト 144.26 3.37 0.37 0.74
磁鉄鉱珪岩 129.86 3.42 0.36 0.82
レベル6の鉄鉱石 250.4 3.48 0.2 1.08
レベル5の鉄鉱石 193.56 3.42 0.23 0.96
鉄鉱石の第二層 186.05 3.49 0.29 0.98
鉄鉱石の第三層 168.78 3.41 0.15 0.89
赤鉄鉱珪岩 205.5 3.38 0.89 0.7
石英岩 200.4 2.69 0.95 0.6
緑泥石 39 2.93 0.94 0.3
ミグマタイト 68.6 2.58 0.91 0.5
赤鉄鉱珪岩 192.71 3.48 0.38 0.63
シャーシ角閃岩 2 60.4 2.88 0.39 0.75
シリカマウンテン珪岩 160.68 2.63 0.34 0.74


3、DT 法の分類ステップ

出典:DT法に基づく石油化学埠頭の貯蔵タンクエリアにおける危険源の動的分類に関する研究_Cui Yiyuan[D]

 

4番目、Pythonの実装

import pandas as pd
import numpy as np
from numpy import *
import sympy as sp

import matplotlib.pyplot as plt
import numpy as np
from sympy import *
import math

from pylab import *
plt.rcParams['axes.unicode_minus']=False  #用于解决不能显示负号的问题
mpl.rcParams['font.sans-serif'] = ['SimHei']
data =  pd.read_excel("DT分析样本.xlsx",index_col="矿岩名称")  
S = np.sqrt(((data-data.mean())**2).sum()/(len(data.index)-1))
x2_2 = (data - data.mean())/S
S_i = x2_2.sum(axis=1)
AMAX = max(S_i)
AMIN = min(S_i)
K = 19
NC_i = np.floor(((K-1)*(AMAX-S_i)/(AMAX-AMIN))+0.5)+1
NC_i = pd.DataFrame(NC_i)
NC_i.columns = ["NC"]
data = data.add(NC_i,fill_value=0)
x = []
y = []
for K in range(2,20):
    data =  pd.read_excel("DT分析样本.xlsx",index_col="矿岩名称")  
    S = np.sqrt(((data-data.mean())**2).sum()/len(data.index))
    x2_2 = (data - data.mean())/S
    data = (data - data.mean())/S
    S_i = x2_2.sum(axis=1)
    AMAX = max(S_i)
    AMIN = min(S_i)

    NC_i = np.floor(((K-1)*(AMAX-S_i)/(AMAX-AMIN))+0.5)+1
    NC_i = pd.DataFrame(NC_i)
    NC_i.columns = ["NC"]
    data = data.add(NC_i,fill_value=0)

    for i in range(300):
#         print(K,i)
        temp = data["NC"].copy()

        value = pd.DataFrame(columns=["type","num","value"])
        for eachIndex in data.index:
            for each in set(data["NC"]):
                value = value.append({"type":eachIndex,"num":each,"value":np.sqrt(((data.loc[eachIndex] - data[data["NC"] ==each].mean())**2).sum())},ignore_index=True)
        value = value.set_index(["type"])
        for index in set(value.index):
            data.loc[index]["NC"] = value.loc[index].sort_values("value").iloc[0]["num"]


        if (temp-data["NC"]).abs().sum() < 0.001:
            sum = 0
            for index in data.index:
                sum += value.loc[index][value.loc[index]["num"]==data.loc[index]["NC"]]["value"].sum()
            x.append(K)
            y.append(sum)
            print(K,sum)
            break

  PS: オンライン多項式フィッティング Web サイト 

plt.figure(figsize=(8,4))

x_1 = np.linspace(2,19,500)
y_1 = 33.1714313933564 - 2.6804554847376*x_1 + 0.0626813808370871*x_1**2 + 0.00359821535505567*x_1**3 - 0.00018026487545368*x_1**4

plt.scatter(x,y,label="理论值",linewidth=2,color="r")
plt.plot(x_1,y_1,linewidth=2,label="拟合曲线")
plt.xlabel("分类数目K",fontsize=20)
plt.ylabel("分类函数值DS",fontsize=20)
plt.yticks([5,10,15,20,25])
plt.xticks([2,4,6,8,10,12,14,16,18,20])

plt.legend(fontsize=15)
plt.tick_params(labelsize=20)
plt.savefig("DS",dpi=300,bbox_inches ="tight")

5. 結果

おすすめ

転載: blog.csdn.net/zsllsz2022/article/details/124322551