Реализация алгоритма персептрона, но неэффективная при его зацикливании ⇐ Python
Реализация алгоритма персептрона, но неэффективная при его зацикливании
Когда размер выборки равен 10, среднее количество итераций до сходимости должно быть около 15. Однако при реализации алгоритма в моем коде для достижения сходимости требуется примерно 225 (или более!) Итераций. Это заставляет меня подозревать, что в моем коде может быть проблема с циклом while, но я не могу ее определить.
def gen_data(N=10): размер = (Н, 2) данные = np.random.uniform(-1, 1, размер) точка1, точка2 = данные[np.random.choice(data.shape[0], 2, replace=False), :] m = (точка2[1] - точка1[1]) / (точка2[0] - точка1[0]) c = точка1[1] - m * точка1[0] labels = np.array([+1, если y >= m * x + c else -1 для x, y в данных]) данные = np.column_stack((данные, метки)) вернуть данные, точка1, точка2 класс ПЛА: def __init__(сам, данные): м, n = data.shape self.X = np.hstack((np.ones((m, 1)), data[:, :2])) self.w = np.zeros(n) self.y = данные[:, -1] self.count = 0 определенно подходит (сам): пока правда: self.count += 1 y_pred = self.predict(self.X) неправильно классифицирован = np.where(y_pred != self.y)[0] если len(неправильно классифицировано) == 0: перерыв idx = np.random.choice(неправильно классифицировано) self.update_weight(idx) def update_weight(self, idx): self.w += self.y[idx] * self.X[idx] знак защиты (я, z): вернуть np.where(z > 0, 1, np.where(z < 0, -1, 0)) def предсказать(сам, х): z = np.dot(x, self.w) вернуть self.sign(z)
Когда размер выборки равен 10, среднее количество итераций до сходимости должно быть около 15. Однако при реализации алгоритма в моем коде для достижения сходимости требуется примерно 225 (или более!) Итераций. Это заставляет меня подозревать, что в моем коде может быть проблема с циклом while, но я не могу ее определить.
def gen_data(N=10): размер = (Н, 2) данные = np.random.uniform(-1, 1, размер) точка1, точка2 = данные[np.random.choice(data.shape[0], 2, replace=False), :] m = (точка2[1] - точка1[1]) / (точка2[0] - точка1[0]) c = точка1[1] - m * точка1[0] labels = np.array([+1, если y >= m * x + c else -1 для x, y в данных]) данные = np.column_stack((данные, метки)) вернуть данные, точка1, точка2 класс ПЛА: def __init__(сам, данные): м, n = data.shape self.X = np.hstack((np.ones((m, 1)), data[:, :2])) self.w = np.zeros(n) self.y = данные[:, -1] self.count = 0 определенно подходит (сам): пока правда: self.count += 1 y_pred = self.predict(self.X) неправильно классифицирован = np.where(y_pred != self.y)[0] если len(неправильно классифицировано) == 0: перерыв idx = np.random.choice(неправильно классифицировано) self.update_weight(idx) def update_weight(self, idx): self.w += self.y[idx] * self.X[idx] знак защиты (я, z): вернуть np.where(z > 0, 1, np.where(z < 0, -1, 0)) def предсказать(сам, х): z = np.dot(x, self.w) вернуть self.sign(z)
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как заполнить плоский ассоциативный массив при зацикливании результатов запроса?
Anonymous » » в форуме Php - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-