Переглянути джерело

修复了对于单一特征的Des方法

Huan 5 роки тому
батько
коміт
dd4788f915
1 змінених файлів з 110 додано та 13 видалено
  1. 110 13
      Learn_Numpy.py

+ 110 - 13
Learn_Numpy.py

@@ -2,6 +2,7 @@ from pyecharts.components import Table as Table_Fisrt#绘制表格
 from pyecharts import options as opts
 from random import randint
 from pyecharts.charts import *
+from pyecharts.options.series_options import JsCode
 from pandas import DataFrame,read_csv
 import numpy as np
 import re
@@ -62,6 +63,28 @@ def Prediction_boundary(x_range,x_means,Predict_Func,Type):#绘制回归型x-x
     #r是绘图大小列表,x_means是其余值,Predict_Func是预测方法回调
     # a-特征x,b-特征x-1,c-其他特征
     o_cList = []
+    if len(x_means) == 1:
+        n_ra = x_range[0]
+        if Type[0] == 1:
+            ra = make_list(n_ra[0], n_ra[1], 70)
+        else:
+            ra = n_ra
+
+        a = np.array([i for i in ra]).reshape(-1,1)
+        y_data = Predict_Func(a)[0].tolist()
+        value = [[0 , float(a[i]), y_data[i]] for i in range(len(a))]
+        c = (HeatMap()
+             .add_xaxis(['None'])
+             .add_yaxis(f'数据', np.unique(a), value, **Label_Set)  # value的第一个数值是x
+             .set_global_opts(title_opts=opts.TitleOpts(title='预测热力图'), **global_Leg,
+                              yaxis_opts=opts.AxisOpts(is_scale=True, type_='category'),  # 'category'
+                              xaxis_opts=opts.AxisOpts(is_scale=True, type_='category'),
+                              visualmap_opts=opts.VisualMapOpts(is_show=True, max_=int(max(y_data)) + 1,
+                                                                min_=int(min(y_data)),
+                                                                pos_right='3%'))  # 显示
+             )
+        o_cList.append(c)
+        return o_cList
     for i in range(len(x_means)):
         if i == 0:
             continue
@@ -106,6 +129,29 @@ def Decision_boundary(x_range,x_means,Predict_Func,class_,Type):#绘制分类型
     for i in class_dict:
         v_dict.append({'min':class_dict[i]-0.5,'max':class_dict[i]+0.5,'label':i})
     o_cList = []
+    if len(x_means) == 1:
+        n_ra = x_range[0]
+        if Type[0] == 1:
+            ra = make_list(n_ra[0], n_ra[1], 70)
+        else:
+            ra = n_ra
+
+        a = np.array([i for i in ra]).reshape(-1,1)
+        y_data = Predict_Func(a)[0].tolist()
+        value = [[0,float(a[i]), class_dict.get(y_data[i], -1)] for i in range(len(a))]
+        c = (HeatMap()
+             .add_xaxis(['None'])
+             .add_yaxis(f'数据', np.unique(a), value, **Label_Set)  # value的第一个数值是x
+             .set_global_opts(title_opts=opts.TitleOpts(title='预测热力图'), **global_Leg,
+                              yaxis_opts=opts.AxisOpts(is_scale=True, type_='category'),  # 'category'
+                              xaxis_opts=opts.AxisOpts(is_scale=True, type_='category'),
+                              visualmap_opts=opts.VisualMapOpts(is_show=True, max_=max(class_dict.values()),
+                                                                min_=-1,
+                                                                is_piecewise=True, pieces=v_dict,
+                                                                orient='horizontal', pos_bottom='3%'))
+             )
+        o_cList.append(c)
+        return o_cList
     for i in range(len(x_means)):
         if i == 0:
             continue
@@ -259,11 +305,15 @@ def get_Color():
 def is_continuous(data:np.array,f:float=0.1):
     data = data.tolist()
     l = np.unique(data).tolist()
-    re = len(l)/len(data)>=f or len(data) <= 3
-    return re
+    try:
+        re = len(l)/len(data)>=f or len(data) <= 3
+        return re
+    except:return False
 
-def Training_visualization(x_trainData,class_,y):
+def Training_visualization(x_trainData,class_,y):#根据不同类别绘制x-x分类散点图
     x_data = x_trainData.T
+    if len(x_data) == 1:
+        x_data = np.array([x_data,np.zeros(len(x_data[0]))])
     Cat = Categorical_Data()
     o_cList = []
     for i in range(len(x_data)):
@@ -300,6 +350,8 @@ def Training_visualization(x_trainData,class_,y):
 
 def Training_W(x_trainData,class_,y,w_list,b_list,means:list):#针对分类问题绘制决策边界
     x_data = x_trainData.T
+    if len(x_data) == 1:
+        x_data = np.array([x_data,np.zeros(len(x_data[0]))])
     o_cList = []
     means.append(0)
     means = np.array(means)
@@ -348,6 +400,8 @@ def Training_W(x_trainData,class_,y,w_list,b_list,means:list):#针对分类问
 
 def Regress_W(x_trainData,y,w:np.array,b,means:list):#针对回归问题(y-x图)
     x_data = x_trainData.T
+    if len(x_data) == 1:
+        x_data = np.array([x_data,np.zeros(len(x_data[0]))])
     o_cList = []
     means.append(0)#确保mean[i+1]不会超出index
     means = np.array(means)
@@ -397,6 +451,8 @@ def regress_visualization(x_trainData,y):#y-x数据图
 def Feature_visualization(x_trainData,data_name=''):#x-x数据图
     seeting = global_Set if data_name else global_Leg
     x_data = x_trainData.T
+    if len(x_data) == 1:
+        x_data = np.array([x_data,np.zeros(len(x_data[0]))])
     o_cList = []
     for i in range(len(x_data)):
         for a in range(len(x_data)):
@@ -419,9 +475,42 @@ def Feature_visualization(x_trainData,data_name=''):#x-x数据图
             o_cList.append(c)
     return o_cList
 
+def Feature_visualization_Format(x_trainData,data_name=''):#x-x数据图
+    seeting = global_Set if data_name else global_Leg
+    x_data = x_trainData.T
+    if len(x_data) == 1:
+        x_data = np.array([x_data,np.zeros(len(x_data[0]))])
+    o_cList = []
+    for i in range(len(x_data)):
+        for a in range(len(x_data)):
+            if a <= i: continue#重复内容,跳过
+            x1 = x_data[i]  # x坐标
+            x1_con = is_continuous(x1)
+            x2 = x_data[a]  # y坐标
+            x2_con = is_continuous(x2)
+            x2_new = np.unique(x2)
+            x1_list = x1.astype(np.str).tolist()
+            for i in range(len(x1_list)):
+                x1_list[i] = [x1_list[i],f'特征{i}']
+            #x与散点图不同,这里是纵坐标
+            c = (Scatter()
+                 .add_xaxis(x2)
+                 .add_yaxis(data_name, x1, **Label_Set)
+                 .set_global_opts(title_opts=opts.TitleOpts(title=f'[{i}-{a}]数据散点图'), **seeting,
+                                  yaxis_opts=opts.AxisOpts(type_='value' if x2_con else 'category',is_scale=True),
+                                  xaxis_opts=opts.AxisOpts(type_='value' if x1_con else 'category',is_scale=True),
+                                  tooltip_opts=opts.TooltipOpts(is_show = True,axis_pointer_type = "cross",
+                formatter=JsCode("function (params) {params.data[2];}")),)
+                 )
+            c.add_xaxis(x2_new)
+            o_cList.append(c)
+    return o_cList
+
 def Discrete_Feature_visualization(x_trainData,data_name=''):#必定离散x-x数据图
     seeting = global_Set if data_name else global_Leg
     x_data = x_trainData.T
+    if len(x_data) == 1:
+        x_data = np.array([x_data,np.zeros(len(x_data[0]))])
     o_cList = []
     for i in range(len(x_data)):
         for a in range(len(x_data)):
@@ -463,6 +552,13 @@ def Conversion_Separate(y_data,x_data,tab):#并列显示两x-x图
             except IndexError:pass
     return tab
 
+def Conversion_Separate_Format(y_data,tab):#并列显示两x-x图
+    if type(y_data) is np.ndarray:
+        get_y = Feature_visualization_Format(y_data,'转换数据')#转换
+        for i in range(len(get_y)):
+            tab.add(get_y[i],f'[{i}]变维数据x-x散点图')
+    return tab
+
 def make_bar(name, value,tab):#绘制柱状图
     c = (
         Bar()
@@ -724,14 +820,15 @@ class LogisticRegression_Model(Study_MachineBase):
         y = self.y_trainData
         x_data = self.x_trainData
         get, x_means, x_range, Type = Training_visualization(x_data, class_, y)
+        get_Line = Training_W(x_data, class_, y, w_list, b, x_means.copy())
         for i in range(len(get)):
-            tab.add(get[i], f'{i}决策边界')
+            tab.add(get[i].overlap(get_Line[i]), f'{i}决策边界散点图')
 
         for i in range(len(w_list)):
             w = w_list[i]
             w_heard = [f'系数w[{i},{j}]' for j in range(len(w))]
-            tab.add(scatter(w_heard, w), '系数w散点图')
-            tab.add(bar(w_heard, w_array[i]), '系数柱状图')
+            tab.add(scatter(w_heard, w), f'系数w[{i}]散点图')
+            tab.add(bar(w_heard, w_array[i]), f'系数w[{i}]柱状图')
 
         columns = class_heard + ['截距b','C','最大迭代数']
         data = class_ + [b,c,max_iter]
@@ -1028,7 +1125,7 @@ class SVC_Model(Study_MachineBase):
         get, x_means, x_range, Type = Training_visualization(x_data, class_, y)
         get_Line = Training_W(x_data, class_, y, w_list, b, x_means.copy())
         for i in range(len(get)):
-            tab.add(get[i].overlap(get_Line[i]), f'{i}数据散点图')
+            tab.add(get[i].overlap(get_Line[i]), f'{i}决策边界散点图')
 
         get = Decision_boundary(x_range, x_means, self.Predict, class_, Type)
         for i in range(len(get)):
@@ -1705,7 +1802,7 @@ class PCA_Model(Unsupervised):
         tab = Tab()
         y_data = self.y_trainData
         x_data = self.x_trainData
-        Conversion_Separate(y_data,x_data,tab)
+        Conversion_Separate_Format(y_data,tab)
 
         save = Dic + r'/render.HTML'
         tab.render(save)  # 生成HTML
@@ -1730,7 +1827,7 @@ class RPCA_Model(Unsupervised):
         tab = Tab()
         y_data = self.y_trainData
         x_data = self.x_trainData
-        Conversion_Separate(y_data,x_data,tab)
+        Conversion_Separate_Format(y_data,tab)
 
         save = Dic + r'/render.HTML'
         tab.render(save)  # 生成HTML
@@ -1755,7 +1852,7 @@ class KPCA_Model(Unsupervised):
         tab = Tab()
         y_data = self.y_trainData
         x_data = self.x_trainData
-        Conversion_Separate(y_data,x_data,tab)
+        Conversion_Separate_Format(y_data,tab)
 
         save = Dic + r'/render.HTML'
         tab.render(save)  # 生成HTML
@@ -1779,7 +1876,7 @@ class LDA_Model(Unsupervised):
         tab = Tab()
         y_data = self.y_trainData
         x_data = self.x_trainData
-        Conversion_Separate(y_data,x_data,tab)
+        Conversion_Separate_Format(y_data,tab)
 
         save = Dic + r'/render.HTML'
         tab.render(save)  # 生成HTML
@@ -1804,7 +1901,7 @@ class NMF_Model(Unsupervised):
         tab = Tab()
         y_data = self.y_trainData
         x_data = self.x_trainData
-        Conversion_Separate(y_data,x_data,tab)
+        Conversion_Separate_Format(y_data,tab)
 
         save = Dic + r'/render.HTML'
         tab.render(save)  # 生成HTML
@@ -1832,7 +1929,7 @@ class TSNE_Model(Unsupervised):
         tab = Tab()
         y_data = self.y_trainData
         x_data = self.x_trainData
-        Conversion_Separate(y_data,x_data,tab)
+        Conversion_Separate_Format(y_data,tab)
 
         save = Dic + r'/render.HTML'
         tab.render(save)  # 生成HTML