# 大模型特征算子
大模型特征算子以extension形式封装为文件置于DWS系统，通过CREATE EXTENSION命令创建，大模型直接调用封装好的Python UDF函数。**该功能仅9.1.1.200及以上集群版本支持**。
在存算分离架构下，大模型特征算子功能（CREATE EXTENSION语句）仅支持在主VW上执行。
使用示例：建立一个简单的故障预测模型，使用均方根值作为特征值。
1. 用户创建EXTENSION，加载大模型特征算子bq_ops。 
   ```
   CREATE EXTENSION bq_ops;
   ```
   创建完成后，Python UDF函数自动完成加载，大模型特征算子函数及功能如下表。函数类型均为pythonUDF，返回值类型均为double，反映当前信号的某些特征值。
   表1函数列表 
   | 信号特征类型         | 函数名                                                        | 算子功能                                                                                          |
   |:---|:---|:---|
   | **基础时域特征指标**   | get_sharpness(signal double precision\[\], fs int)          | 尖锐度，例如声音信号反映了中高频成分的多少及其对人耳的刺激程度，数值越大声音听起来越尖锐。                                                  |
   | **基础时域特征指标**   | get_roughness(signal double precision\[\], fs int)         | 粗糙度，例如声音信号感知粗糙程度的指标，主要用于描述声音在时间上的快速波动对人耳的影响。                                                    |
   | **基础时域特征指标**   | get_mean_square(signal double precision\[\])                | 均方值，反映了振动信号在时间域内的平均能量水平。                                                                        |
   | **基础时域特征指标**   | get_rms(signal double precision\[\])                       | 均方根值(有效值)，一般表征振动信号能量或强度。                                                                      |
   | **基础时域特征指标**   | get_var(signal double precision\[\])                       | 方差值，反映了信号幅值相对于其平均值的离散程度。                                                                      |
   | **基础时域特征指标**   | get_pk_pk(signal double precision\[\])                     | 峰峰值，表征振动信号幅值波动范围的一个重要指标。                                                                     |
   | **基础时域特征指标**   | get_shape_factor(signal double precision\[\])                | 波形指标，衡量振动信号波形平坦程度的无量纲指标，计算为均方根值与绝对平均值的比值。它表征的是信号幅值分布的集中特性，反映波形与理想正弦波的偏离程度，对信号中的冲击成分和非高斯特性敏感。   |
   | **基础时域特征指标**   | get_crest(signal double precision\[\])                      | 峰值因数，反映了信号峰值与有效值（RMS值）之间的比例关系，用于描述信号的冲击特性或波形尖锐程度。                                             |
   | **基础时域特征指标**   | get_impulse(signal double precision\[\])                  | 脉冲因数，反映了信号峰值与平均值之间的比例关系，主要用于评估信号中的冲击特性或瞬时能量集中程度。                                              |
   | **基础时域特征指标**   | get_clearance(signal double precision\[\])                   | 裕度，衡量振动信号中极端冲击强度的无量纲指标，计算为峰值与方根幅值的比值。它表征的是信号中最大峰值相对于典型幅值水平的突出程度，对严重局部故障（如严重剥落、断裂）产生的剧烈冲击异常敏感。 |
   | **基础时域特征指标**   | get_skewness(signal double precision\[\])                  | 偏斜度，反映了信号幅值分布相对于其平均值的偏斜方向和程度。                                                                  |
   | **基础时域特征指标**   | get_kurt(signal double precision\[\])                       | 峭度，通过振动信号幅值分布尖锐程度或尾部特性，反映信号幅值分布相对于正态分布的尖锐程度和异常值（如冲击或瞬态事件）的存在。                                 |
   | **基础时域特征指标**   | get_gini(signal double precision\[\])                       | 基尼指数，表征信号能量分布均匀性或集中程度的指标。它最初来源于经济学中的收入不平等度量，在信号处理领域被广泛应用于评估信号的能量分布特性。                         |
   | **频域及声学特征指标** | get_spec_ctrd(signal double precision\[\], fs int)         | 重心频率，信号功率谱的质量中心，反映了信号中能量的集中位置。                                                                |
   | **频域及声学特征指标** | get_spec_ms(signal double precision\[\], fs int)             | 均方频率，信号频谱各频率分量的平方的加权平均，反映信号能量的频率分布特性。                                                          |
   | **频域及声学特征指标** | get_spec_rms(signal double precision\[\], fs int)          | 均方根频率，信号频谱的平方和的平方根，用于描述信号频谱的总体分布情况。                                                           |
   | **频域及声学特征指标** | get_spec_var_ctrd(signal double precision\[\], fs int)      | 频谱方差，信号频谱分布的方差，反映了信号频率成分的分散程度。                                                               |
   | **频域及声学特征指标** | get_spec_std_ctrd(signal double precision\[\], fs int)      | 频谱标准差，频率方差的平方根，用于描述信号频谱分布的离散程度。                                                              |
   | **频域及声学特征指标** | get_pse(signal double precision\[\], fs int)                | 谱熵，表征信号频域能量分布复杂度或无序程度的一个重要指标。它基于信息熵的概念，用于描述信号在频域中的能量分布特性。                                    |
   | **频域及声学特征指标** | get_env_rms(signal double precision\[\])                    | 包络谱均方根，表征信号包络谱能量水平，反映了信号中调制成分（如故障特征频率）的整体能量强度。                                                |
   | **频域及声学特征指标** | get_ehr(signal double precision\[\])                         | 谐波率，用于评估信号中谐波成分的强度，反映信号的周期性特征或非线性特性。                                                        |
   | **频域及声学特征指标** | get_kurt_aver(signal double precision\[\])                  | 平均峭度，对一段信号或多组信号的峭度值进行平均，用于评估长期内信号的冲击特性变化。                                                      |
   | **频域及声学特征指标** | get_mpf(signal double precision\[\], fs int)                | 转速，指在单位时间内的旋转次数，通常以每分钟转数 (RPM) 表示。                                                            |
   | **带通滤波分段指标**  | get_bpf_0_500_rms(signal double precision\[\], fs int)      | 低频有效值(均方根)，对信号做0-500Hz低通滤波后，计算有效值，描述低频信号的能量或强度。                                               |
   | **带通滤波分段指标**  | get_bpf_500_2000_rms(signal double precision\[\], fs int)    | 中频有效值(均方根)，对信号做500-2000Hz带通滤波后，计算有效值，描述中频信号的能量或强度。                                            |
   | **带通滤波分段指标**  | get_bpf_2000_inf_rms(signal double precision\[\], fs int)   | 高频有效值(均方根)，对信号做2000-fs/2Hz高通滤波后，计算有效值，描述高频信号的能量或强度。                                            |
   | **带通滤波分段指标**  | get_bpf_0_500_kurt(signal double precision\[\], fs int)   | 低频峭度，对信号做0-500Hz低通滤波后，计算峭度指标，描述低频信号中冲击性的强弱。                                                   |
   | **带通滤波分段指标**  | get_bpf_500_2000_kurt(signal double precision\[\], fs int)   | 中频峭度，对信号做500-2000Hz带通频滤波后，计算峭度指标，描述中频信号中冲击性的强弱。                                              |
   | **带通滤波分段指标**  | get_bpf_2000_inf_kurt(signal double precision\[\], fs int) | 高频峭度，对信号做2000-fs/2Hz高通滤波后，计算峭度指标，描述高频信号中冲击性的强弱。                                             |
   | **带通滤波分段指标**  | get_bpf_0_500_ehr(signal double precision\[\], fs int)      | 低频谐波率，对信号做0-500Hz低通滤波后，计算谐噪比，描述低频信号中谐波成分与噪声成分强度比。                                              |
   | **带通滤波分段指标**  | get_bpf_500_2000_ehr(signal double precision\[\], fs int)   | 中频谐波率，对信号做500-2000Hz带通滤波后，计算谐噪比，描述中频信号中谐波成分与噪声成分强度比。                                           |
   | **带通滤波分段指标**  | get_bpf_2000_inf_ehr(signal double precision\[\], fs int)   | 高频谐波率，对信号做2000-fs/2Hz高通滤波后，计算谐噪比，描述高频信号中谐波成分与噪声成分强度比。                                       |
      
   
   
2. 创建表bq_col_table，device_code表示当前设备号，measuring_point_code表示测量点编码，date_time表示信号采集日期，high_array列表示当前接收的信号 
   ```
   CREATE TABLE bq_col_table(device_code varchar, measuring_point_code text,date_time timestamp with time zone, high_array double precision[]) with (orientation=column, enable_hstore_opt=true);
   ```
   每隔1小时采集10秒钟信号，假设当前入库时数据如下。
   ```
   INSERT INTO bq_col_table VALUES
   ('10098819','3a138131-344a-af96-9e9d-da049656d905','2024-07-13 17:59:59+08:00','{0.527995824813842,-0.62188184261322,-0.332374721765518,-0.139671847224235,-0.308928370475769,-0.165734529495239,0.137558653950691,-0.923967480659484,-0.398990541696548,0.620271801948547,0.366085141897201,-0.873452186584472,-1.00577819347381,-0.581831872463226,0.0675214752554893,0.789226412773132,-0.643114387989044,-0.779465496540069,0.913703441619873,1.33372521400451,-0.0830182060599327,0.621579945087432,1.48476803302764}');
   ```
   
   
3. 调用算子get_rms()计算信号均方根值，当前样本信号的振动信号能量强度。上述样例数据结果为： 
   ```
   SELECT device_code, measuring_point_code, date_time, get_rms(high_array) FROM bq_col_table;
    device_code |         measuring_point_code         |       date_time        |     get_rms
   -------------+--------------------------------------+------------------------+------------------
    10098819    | 3a138131-344a-af96-9e9d-da049656d905 | 2024-07-13 17:59:59+08 | .705324261533061
   (1 row)
   ```
   
   
4. 重复上述步骤，采集10天信号数据为样本，设定rms的正常取值区间，假设为\[0.5, 0.8\]。
5. 如果有异常信号入库。 
   ```
   INSERT INTO bq_col_table VALUES
   ('10098819','3a138131-344a-af96-9e9d-da049656d905','2024-07-13 07:59:59+08:00','{0.544054210186004,-0.769003570079803,-1.79972970485687,0.659896433353424,1.65061652660369,-0.221043065190315,-1.83933162689208,-2.58152985572814,-0.627029538154602,2.1537218093872,2.14685225486755,-0.0429693721234798,-1.21243667602539,-1.02749335765838,-0.526543200016021,-0.0408141687512397,1.96406400203704,2.1080584526062,0.257277429103851,-1.36532151699066,-2.31293749809265,-0.803890943527221,1.13646578788757}');
   ```
   此时库中将存在异常的rms值1.43，据此可以分析该异常信号。
   ```
   SELECT device_code, measuring_point_code, date_time, get_rms(high_array) FROM bq_col_table;
    device_code |         measuring_point_code         |       date_time        |     get_rms
   -------------+--------------------------------------+------------------------+------------------
    10098819    | 3a138131-344a-af96-9e9d-da049656d905 | 2024-07-13 17:59:59+08 | .705324261533061
    ……
    10098819    | 3a138131-344a-af96-9e9d-da049656d905 | 2024-07-13 07:59:59+08 | 1.43480152874657
   ```
   
   
![](https://support.huaweicloud.com/devg-911-dws/public_sys-resources/note_3.0-zh-cn.png)
使用上述算子时，会引用第三方库numpy、scipy等，将会导致udf进程的内存占用增大。典型的算子如：get_skewness、get_kurt、get_env_rms、get_ehr、get_kurt_aver、get_bpf_0_500_rms、get_bpf_500_2000_rms、get_bpf_2000_inf_rms、get_bpf_0_500_kurt、get_bpf_500_2000_kurt、get_bpf_2000_inf_kurt、get_bpf_0_500_ehr、get_bpf_500_2000_ehr、get_bpf_2000_inf_ehr。使用时请保证参数[udf_memory_limit](https://support.huaweicloud.com/devg-911-dws/dws_04_0509.html#ZH-CN_TOPIC_0000002202140613__li103284351164)不少于2GB。
