构造性覆盖算法(python实现)

from cmath import sqrt
import numpy as np
from torch.utils.tensorboard  import  SummaryWriter
from numpy import size, dot
from sklearn import datasets as UCI_datasets  # UCI 数据集在sklearn.datasets中有

writer=SummaryWriter("logs")
# **************************
def mycompare_Minimum_radius_method_on_Trdata(index1, index2):
    ans = 0
    for i in range(0, len(feaName)):
        ans = ans + (Tr[index1].data[i] - Tr[index2].data[i]) * (Tr[index1].data[i] - Tr[index2].data[i])
    result = sqrt(ans)
    # return dot(Tr[index1].data, Tr[index2].data)
    return ans


def mycompare_Minimum_radius_method_on_Vardata(index1, index2):
    ans = 0
    for i in range(0, len(feaName)):
        ans = ans + (Var[index1].data[i] - Hidden_Index[index2].data[i]) * (
                Var[index1].data[i] - Hidden_Index[index2].data[i])
    result = sqrt(ans)
    # return dot(Tr[index1].data, Tr[index2].data)
    return ans


def mycompare_Minimum_radius_method_on_Alldata(index1, index2, k):
    ans = 0
    for i in range(0, len(feaName)):
        ans = ans + (Mydata[index1].data[i] - Hidden_Indexs[k][index2].data[i]) * (Mydata[index1].data[i] - Hidden_Indexs[k][index2].data[i])
    result = sqrt(ans)
    # return dot(Tr[index1].data, Tr[index2].data)
    return ans


def remainder_num_Trdata():
    num = 0
    for i in Tr:
        if i.flag == 0:
            num = num + 1
    return num


def remainder_num_Vardata():
    num = 0
    for i in Var:
        if i.flag == 0:
            num = num + 1
    return num


nHidden = 0
# *************************
# ********加载数据集**********
Data = UCI_datasets.load_digits()

feaName = Data.feature_names  # 数据集特征名称
tarName = Data.target_names  # 数据集标签名称

myData = np.array(Data.data)  # 数据集数据
labels = np.array(Data.target)  # 数据集标签
DataSet_wine = {}
DataSet_wine['feature_names'] = feaName
DataSet_wine['class_names'] = tarName
DataSet_wine['data'] = myData
DataSet_wine['label'] = labels
# ********加载数据集完毕**********
print(tarName,labels)

Data_All_num = size(DataSet_wine['data']) / size(DataSet_wine['feature_names'])
# 划分出数据集与测试机
x = np.random.randint(0, Data_All_num, int(Data_All_num))
# y = (x > 0).astype(int)
# 打乱下标顺序
shuffle_indexs = np.random.permutation(len(x))
# 留几成当作测试数据集
test_radio = 0.3
# 求出test的个数
test_size = int(len(x) * test_radio)
test_size_10 = int(len(x) / 10)
# 比如说我现在0-test_size当作test的数据,test_size-最后当成train数据
test_indexs = shuffle_indexs[:test_size]
train_indexs = shuffle_indexs[test_size:]
Tr_data = []
Var_data = []
Tr_label = []
Var_label = []
Tr = []
Var = []
Hidden_Index = []
Hidden_to_label = []


class Hidd_index():
    def __init__(self, hidden, label, radius, datas):
        self.hidden = hidden
        self.label = label
        self.radiu = radius
        self.data = datas


#######数据划分完毕
class CoV():
    def __init__(self, data, label):
        self.data = data
        self.label = label
        self.radiu = 0  # 该点覆盖的半径
        self.flag = 0  # 表示该点未访问过 1代表访问过,2代表根源节点
        self.hidden = -1  # 表示该点所属的隐藏层

    def set_radius(self, radius):
        self.radiu = radius


Mydata = []
for i in range(0, len(x)):
    Mydata.append(CoV(myData[i], labels[i]))

for i in train_indexs:
    Tr_data.append(myData[i])
    Tr_label.append(labels[i])
    Tr.append(CoV(myData[i], labels[i]))
for i in test_indexs:
    Var_data.append(myData[i])
    Var_label.append(labels[i])
    Var.append(CoV(myData[i], labels[i]))
# *********************Train Begin***********************
while remainder_num_Trdata() != 0:
    x = np.random.randint(0, len(Tr))
    if Tr[x].flag == 1 or Tr[x].flag == 2:
        continue
    if Tr[x].flag == 0:
        Tr[x].flag = 2
        dis = float('inf')
        dis1 = float(0)
        for i in range(0, len(Tr)):
            # if (dis<mycompare_Minimum_radius_method_on_Trdata(x, i)) and Tr[x].label != Tr[i].label and Tr[x].hidden ==-1:   #最近异类点 求最大内积即求最近的点
            if (mycompare_Minimum_radius_method_on_Trdata(x, i) < dis) and Tr[x].label != Tr[i].label and Tr[
                x].hidden == -1:
                # if (dis<mycompare_Minimum_radius_method_on_Trdata(x, i) ) and Tr[x].label == Tr[i].label:
                dis = mycompare_Minimum_radius_method_on_Trdata(x, i)
        for i in range(0, len(Tr)):
            temp = mycompare_Minimum_radius_method_on_Trdata(x, i)
            if (temp < dis) and Tr[x].label == Tr[i].label and Tr[x].hidden == -1 and dis1 < temp and Tr[x].label == Tr[
                i].label:  # 最远同类点 求最小内积即求最远点
                dis1 = temp
        Tr[x].hidden = nHidden
        Tr[x].radiu = dis1
        for i in range(0, len(Tr)):
            if (mycompare_Minimum_radius_method_on_Trdata(x, i) < Tr[x].radiu) and Tr[i].flag == 0:
                Tr[i].flag = 1
                Tr[i].hidden = nHidden
        nHidden = nHidden + 1
print("单次nHidden", nHidden)
for i in range(0, len(Tr)):
    if Tr[i].flag == 2:
        Hidden_Index.append(Hidd_index(Tr[i].hidden, Tr[i].label, Tr[i].radiu, Tr[i].data))
        # print(Tr[i].hidden, Tr[i].label)

for i in range(0, nHidden):
    for j in range(0, nHidden):
        if i == Hidden_Index[j].hidden:
            Hidden_to_label.append(Hidden_Index[j].label)
#print(Hidden_to_label)
point = 0
for i in range(0, len(Tr)):
    if Hidden_to_label[Tr[i].hidden] == Tr[i].label:
        point = point + 1
print("单次训练集准确率=", point / len(Tr))

# *********************Test Begin***********************
dis = float('inf')
for i in range(0, len(Var)):
    nHidden1 = -1
    dis = float('inf')
    for j in range(0, len(Hidden_Index)):
        if (mycompare_Minimum_radius_method_on_Vardata(i, j) <= dis) and (
                mycompare_Minimum_radius_method_on_Vardata(i, j) <= Hidden_Index[j].radiu):
            dis = mycompare_Minimum_radius_method_on_Vardata(i, j)
            nHidden1 = Hidden_Index[j].hidden
    Var[i].hidden = nHidden1
for i in range(0, len(Var)):
    if Var[i].hidden == -1:
        dis = float('inf')
        for j in range(0, len(Hidden_Index)):
            if (mycompare_Minimum_radius_method_on_Vardata(i, j) <= dis):
                dis = mycompare_Minimum_radius_method_on_Vardata(i, j)
                nHidden1 = Hidden_Index[j].hidden
        Var[i].hidden = nHidden1
point = 0
for i in range(0, len(Var)):
    if Hidden_to_label[Var[i].hidden] == Var[i].label:
        point = point + 1
print("单次测试集准确率=", point / len(Var))
Hidden_Indexs = []
Hidden_to_labels = []
for k in range(0, 10):
    nHidden = 0
    test_indexs = shuffle_indexs[k * test_size_10:k * test_size_10 + test_size_10]
    train_indexs = np.concatenate(
        (shuffle_indexs[k * test_size_10 + test_size_10:], shuffle_indexs[0: k * test_size_10]))
    Tr_data = []
    Var_data = []
    Tr_label = []
    Var_label = []
    Tr = []
    Var = []
    Hidden_Index = []
    Hidden_to_label = []

    for i in train_indexs:
        Tr_data.append(myData[i])
        Tr_label.append(labels[i])
        Tr.append(CoV(myData[i], labels[i]))
    for i in test_indexs:
        Var_data.append(myData[i])
        Var_label.append(labels[i])
        Var.append(CoV(myData[i], labels[i]))

    # *********************Train Begin***********************
    while remainder_num_Trdata() != 0:
        x = np.random.randint(0, len(Tr))
        if Tr[x].flag == 1 or Tr[x].flag == 2:
            continue
        if Tr[x].flag == 0:
            Tr[x].flag = 2
            dis = float('inf')
            dis1 = float(0)
            for i in range(0, len(Tr)):
                # if (dis<mycompare_Minimum_radius_method_on_Trdata(x, i)) and Tr[x].label != Tr[i].label and Tr[x].hidden ==-1:   #最近异类点 求最大内积即求最近的点
                if (mycompare_Minimum_radius_method_on_Trdata(x, i) < dis) and Tr[x].label != Tr[i].label and Tr[
                    x].hidden == -1:
                    dis = mycompare_Minimum_radius_method_on_Trdata(x, i)
            for i in range(0, len(Tr)):
                temp = mycompare_Minimum_radius_method_on_Trdata(x, i)
                if (temp < dis) and Tr[x].label == Tr[i].label and Tr[x].hidden == -1 and dis1 < temp and Tr[x].label == \
                        Tr[i].label:  # 最远同类点 求最小内积即求最远点
                    dis1 = temp
            Tr[x].hidden = nHidden
            Tr[x].radiu = dis1
            for i in range(0, len(Tr)):
                if (mycompare_Minimum_radius_method_on_Trdata(x, i) < Tr[x].radiu) and Tr[i].flag == 0:
                    Tr[i].flag = 1
                    Tr[i].hidden = nHidden
            nHidden = nHidden + 1
    print("单次nHidden", nHidden)
    for i in range(0, len(Tr)):
        if Tr[i].flag == 2:
            Hidden_Index.append(Hidd_index(Tr[i].hidden, Tr[i].label, Tr[i].radiu, Tr[i].data))
            # print(Tr[i].hidden, Tr[i].label)

    for i in range(0, nHidden):
        for j in range(0, nHidden):
            if i == Hidden_Index[j].hidden:
                Hidden_to_label.append(Hidden_Index[j].label)
    # print(Hidden_to_label)
    point = 0
    for i in range(0, len(Tr)):
        if Hidden_to_label[Tr[i].hidden] == Tr[i].label:
            point = point + 1
    print("第", k, "轮训练集准确率=", point / len(Tr))
    Hidden_Indexs.append(Hidden_Index)
    Hidden_to_labels.append(Hidden_to_label)
    writer.add_scalar("训练集准确率",point / len(Tr),k)
    # *********************Test Begin***********************
    dis = float('inf')
    for i in range(0, len(Var)):
        nHidden1 = -1
        dis = float('inf')
        for j in range(0, len(Hidden_Index)):
            if (mycompare_Minimum_radius_method_on_Vardata(i, j) <= dis) and (
                    mycompare_Minimum_radius_method_on_Vardata(i, j) <= Hidden_Index[j].radiu):
                dis = mycompare_Minimum_radius_method_on_Vardata(i, j)
                nHidden1 = Hidden_Index[j].hidden
        Var[i].hidden = nHidden1
    for i in range(0, len(Var)):
        if Var[i].hidden == -1:
            dis = float('inf')
            for j in range(0, len(Hidden_Index)):
                if (mycompare_Minimum_radius_method_on_Vardata(i, j) <= dis):
                    dis = mycompare_Minimum_radius_method_on_Vardata(i, j)
                    nHidden1 = Hidden_Index[j].hidden
            Var[i].hidden = nHidden1
    point = 0
    for i in range(0, len(Var)):
        if Hidden_to_label[Var[i].hidden] == Var[i].label:
            point = point + 1
    print("第", k, "轮测试集准确率", point / len(Var))
    writer.add_scalar("测试集准确率", point / len(Var), k)
#**********************在全体数据集上验证**************************
point = 0
for m in range(0, int(Data_All_num)):  # 全体数据
    a = b = c = 0  # 三类
    for k in range(0, 10):  # 10个分类器
        nHidden1 = -1
        dis = float('inf')
        for j in range(0, len(Hidden_Indexs[k])):
            if (mycompare_Minimum_radius_method_on_Alldata(m, j, k) <= dis) and (
                    mycompare_Minimum_radius_method_on_Alldata(m, j, k) <= Hidden_Indexs[k][j].radiu):
                dis = mycompare_Minimum_radius_method_on_Alldata(m, j, k)
                nHidden1 = Hidden_Indexs[k][j].hidden
            Mydata[i].hidden = nHidden1
        for i in range(0, int(Data_All_num)):
            if Mydata[i].hidden == -1:
                dis = float('inf')
                for j in range(0, len(Hidden_Indexs[k])):
                    if (mycompare_Minimum_radius_method_on_Alldata(i, j, k) <= dis):
                        dis = mycompare_Minimum_radius_method_on_Alldata(i, j, k)
                        nHidden1 = Hidden_Indexs[k][j].hidden
                Mydata[i].hidden = nHidden1
        if Hidden_to_labels[k][Mydata[i].hidden] == 0:
            a = a + 1
        if Hidden_to_labels[k][Mydata[i].hidden] == 1:
            b = b + 1
        if Hidden_to_labels[k][Mydata[i].hidden] == 2:
            c = c + 1
    if a >= b and a >= c and Mydata[m].label == 0:
        point = point + 1
    if b >= a and b >= c and Mydata[m].label == 1:
        point = point + 1
    if c >= a and c >= a and Mydata[m].label == 2:
        point = point + 1
print("集成后的准确率", point / float(Data_All_num))
writer.add_scalar("集成后的准确率",point / float(Data_All_num),1)
writer.close()
import cv2
import numpy as np
from matplotlib import pyplot as plt
from scipy.fftpack import fft2, ifft2, fftshift

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值