天天看點

【DELM分類】基于鴿群算法改進深度學習極限學習機實作資料分類附matlab代碼

1 簡介

人工神經網絡的最大缺點是訓練時間太長進而限制其實時應用範圍,近年來,極限學習機(Extreme Learning Machine, ELM)的提出使得前饋神經網絡的訓練時間大大縮短,然而當原始資料混雜入大量噪聲變量時,或者當輸入資料次元非常高時,極限學習機算法的綜合性能會受到很大的影響.深度學習算法的核心是特征映射,它能夠摒除原始資料中的噪聲,并且當向低次元空間進行映射時,能夠很好的起到對資料降維的作用,是以我們思考利用深度學習的優勢特性來彌補極限學習機的弱勢特性進而改善極限學習機的性能.為了進一步提升DELM預測精度,本文采用麻雀搜尋算法進一步優化DELM超參數,仿真結果表明,改進算法的預測精度更高。

【DELM分類】基于鴿群算法改進深度學習極限學習機實作資料分類附matlab代碼
【DELM分類】基于鴿群算法改進深度學習極限學習機實作資料分類附matlab代碼
【DELM分類】基于鴿群算法改進深度學習極限學習機實作資料分類附matlab代碼
【DELM分類】基于鴿群算法改進深度學習極限學習機實作資料分類附matlab代碼

2 部分代碼

AW = .46
BW = .46
CW = .08
def comparator(pigeon):
    return pigeon.fitness()
def cos_sim(gx, x):
    na = numpy.linalg.norm(gx)
    nb = numpy.linalg.norm(x)
    if na == 0 and nb == 0:
        return 1
    if na == 0:
        return 0
    if nb == 0:
        return 0
    d = numpy.dot(gx, x)
    return d / (na * nb)
class Pigeon:
    def __init__(self, random=False):
        if random:
            self.__x = [rand.uniform(L, U) for _ in range(0, get_number_of_inputs())]
            self.__v = [rand.uniform(0, 1) for _ in range(0, get_number_of_inputs())]
        else:
            self.__x = [.0] * get_number_of_inputs()
            self.__v = [.0] * get_number_of_inputs()
        self.__fitness = None
        self.tpr = .0
        self.fpr = .0
    def update_velocity_and_path(self, pg, t):
        self.__v = [(vi * exp(-R * t) + rand.uniform(0, 1) * (pg.__x[i] - self.__x[i])) for i, vi in
                    enumerate(self.__v)]
        self.__x = [xi + self.__v[i] for i, xi in enumerate(self.__x)]
        self.__fitness = None
        return self
    def mutate(self, prop):
        self.__x = [self.__x[i] if prop <= rand.uniform(0, 1) else self.__x[i] + R * rand.uniform(-1, 1)
                    for i in range(0, get_number_of_inputs())]
        self.__fitness = None
        return self
    @staticmethod
    def desirable_destination_center(pop, np):
        pop.sort(key=comparator)
        n = len(pop[0].__x)
        xc = [.0] * n
        xf = [.0] * n
        f = 0
        for i in range(0, np):
            fi = pop[i].fitness()
            f += fi
            for j in range(0, n):
                xf[j] += pop[i].__x[j] * fi
        for c in range(0, n):
            xc[c] = xf[c] / (np * f)
        return xc
    def update_path(self, xc):
        self.__x = [(xi + rand.uniform(0, 1) * (xc[i] - xi)) for i, xi in enumerate(self.__x)]
        self.__fitness = None
    def fitness(self):
        if not self.__fitness:
            self.tpr, self.fpr, n = calc_fitness(self.__x)
            if n == 0:
                return float("inf")
            a = 1.0 / (self.tpr * 100)
            b = self.fpr * 100
            self.__fitness = n + a + b
        return self.__fitness
    def __get_id(self):
        return "-".join(map(str, self.__x))
    def __str__(self):
        return "[" + ", ".join(format(x, "6.6f") for x in self.__x) + "] " + str(self.fitness())
    def __hash__(self):
        return hash(self.__get_id())
    def __eq__(self, other):
        return isinstance(other, Pigeon) and self.__get_id() == other.__get_id()
    def attr(self):
        return get_attr(self.__x)
    def x(self):
        return self.__x;
class CosinePigeon:
    def __init__(self, random=False):
        if random:
            self.__x = [rand.getrandbits(1) for _ in range(0, get_number_of_inputs())]
        else:
            self.__x = [0] * get_number_of_inputs()
        self.__fitness = None
        self.tpr = .0
        self.fpr = .0
    def update_velocity_and_path(self, pg, t):
        v = cos_sim(pg.__x, self.__x)
        self.__x = [self.__x[i] if v > rand.uniform(0, 1) else pg.__x[i] for i in range(0, get_number_of_inputs())]
        self.__fitness = None
        return self
    def mutate(self, prop):
        self.__x = [self.__x[i] if prop <= rand.uniform(0, 1) else 1 - self.__x[i]
                    for i in range(0, get_number_of_inputs())]
        self.__fitness = None
        return self
    @staticmethod
    def desirable_destination_center(pop, np):
        pop.sort(key=comparator)
        n = len(pop[0].__x)
        xc = [.0] * n
        for i in range(0, np):
            for j in range(0, n):
                xc[j] += pop[i].__x[j]
        for j in range(0, n):
            xc[j] = xc[j] / n
        return xc
    # @staticmethod
    # def desirable_destination_center(pop, np):
    #     pop.sort(key=comparator)
    #     n = len(pop[0].__x)
    #     xc = [.0] * n
    #     xf = [.0] * n
    #     f = .0
    #     for i in range(0, np):
    #         fi = pop[i].fitness()
    #         f += fi
    #         for j in range(0, n):
    #             xf[j] += pop[i].__x[j] * fi
    #     for c in range(0, n):
    #         xc[c] = xf[c] / (np * f)
    #     avg = sum(xc) / len(xc)
    #     return [1 if xc[i] >= avg else 0 for i in range(0, n)]
    # def update_path(self, xc):
    #     v = cos_sim(xc, self.__x)
    #     self.__x = [self.__x[i] if v > rand.uniform(0, 1) else xc[i] for i in range(0, get_number_of_inputs())]
    #     self.__fitness = None
    def update_path(self, xc):
        self.__x = [self.__x[i] if xc[i] > rand.uniform(0, 1) else (1 - self.__x[i]) for i in
                    range(0, get_number_of_inputs())]
        self.__fitness = None
    def fitness(self):
        if not self.__fitness:
            self.tpr, self.fpr, n = calc_fitness(self.__x)
            if n == 0:
                return float("inf")
            a = AW * (1.0 / self.tpr)
            b = BW * self.fpr
            c = CW * (n / get_number_of_inputs())
            self.__fitness = a + b + c
        return self.__fitness
    def __get_id(self):
        return "-".join(map(str, self.__x))
    def __str__(self):
        return "[" + ", ".join(format(x, "6.6f") for x in self.__x) + "] " + str(self.fitness())
    def __hash__(self):
        return hash(self.__get_id())
    def __eq__(self, other):
        return isinstance(other, CosinePigeon) and self.__get_id() == other.__get_id()
    def attr(self):
        return get_attr(self.__x)
    def x(self):
        return self.__x;
class SigmoidalPigeon:
    def __init__(self, random=False):
        if random:
            self.__x = [rand.getrandbits(1) for _ in range(0, get_number_of_inputs())]
            self.__v = [rand.uniform(0, 1) for _ in range(0, get_number_of_inputs())]
        else:
            self.__x = [0] * get_number_of_inputs()
            self.__v = [.0] * get_number_of_inputs()
        self.__fitness = None
        self.tpr = .0
        self.fpr = .0
    def update_velocity_and_path(self, pg, t):
        self.__v = [(vi * exp(-R * t) + rand.uniform(0, 1) * (pg.__x[i] - self.__x[i])) for i, vi in
                    enumerate(self.__v)]
        for i in range(0, get_number_of_inputs()):
            s = 1.0 / (1.0 + exp(-self.__v[i]/2))
            self.__x[i] = 1 if s > rand.uniform(0, 1) else 0
        self.__fitness = None
        return self
    @staticmethod
    def desirable_destination_center(pop, np):
        pop.sort(key=comparator)
        n = len(pop[0].__x)
        xc = [.0] * n
        for i in range(0, np):
            for j in range(0, n):
                xc[j] += pop[i].__x[j]
        for j in range(0, n):
            xc[j] = xc[j] / n
        return xc
    def update_path(self, xc):
        self.__x = [self.__x[i] if xc[i] > rand.uniform(0, 1) else (1 - self.__x[i]) for i in
                    range(0, get_number_of_inputs())]
        self.__fitness = None
    def fitness(self):
        if not self.__fitness:
            self.tpr, self.fpr, n = calc_fitness(self.__x)
            if n == 0:
                return float("inf")
            a = AW * (1.0 / self.tpr)
            b = BW * self.fpr
            c = CW * (n / get_number_of_inputs())
            self.__fitness = a + b + c
        return self.__fitness
    def mutate(self, prop):
        self.__x = [self.__x[i] if prop <= rand.uniform(0, 1) else 1 - self.__x[i]
                    for i in range(0, get_number_of_inputs())]
        self.__fitness = None
        return self
    def __get_id(self):
        return "-".join(map(str, self.__x))
    def __str__(self):
        return "[" + ", ".join(format(x, "6.6f") for x in self.__x) + "] " + str(self.fitness())
    def __hash__(self):
        return hash(self.__get_id())
    def __eq__(self, other):
        return isinstance(other, Pigeon) and self.__get_id() == other.__get_id()
    def attr(self):
        return get_attr(self.__x)      

3 仿真結果

【DELM分類】基于鴿群算法改進深度學習極限學習機實作資料分類附matlab代碼

4 參考文獻

[1]馬萌萌. 基于深度學習的極限學習機算法研究[D]. 中國海洋大學, 2015.

部落客簡介:擅長智能優化算法、神經網絡預測、信号處理、元胞自動機、圖像處理、路徑規劃、無人機等多種領域的Matlab仿真,相關matlab代碼問題可私信交流。

部分理論引用網絡文獻,若有侵權聯系部落客删除。

繼續閱讀