路径机器:一种算法思想

背景知识


大约15年前,我了解了基本路径的存在-可以通过连通性区分拓扑空间的组。 其余的将与它们无关,但是他们提出了回归器和分类器的想法-无需基于存储样本进行任何优化。

进一步的细节。

想法和猜想


由于基本路径是从选定点开始的回路,并且在它们上是等效的,那么如何在数据中找到这样的回路? 并且有必要吗?

这个想法与KNN和SVM(“类似”算法)类似。 如果将循环替换为“管道”,即从一个数据点到另一个数据点的圆柱,并且将落入管道的东西分配给与路径的这两个点相同的类(不再是基本的),该怎么办? “管道”的宽度必须能够正确地分类类别……并且在极限范围内,它是一条直线。 沿途到新的未知点的距离应该最小,然后我们可以将其归为与路径相同的类。



可以通过在数据点之间的直线上投影一个点,然后以与投影分割路径的比率相同的比率内插对应于数据点的目标值来构造回归器。

这种构造方法会记住整个样本,并在训练集上提供准确的预测。

原始实现


如何建立路径? 我根据规范采用最大元素,然后开始搜索最接近它的元素,并连接接收到的路径。 最后-以开头关闭(当然值得商but,但是那样)。

估算器
这是代码的第一个版本,请参阅下面的更新笔记本。

class PathMachine(BaseEstimator): def __init__(self, norm=np.linalg.norm, classify=False): self.norm = norm self.classify = classify def find_start(self, X): index_max = None value_max = -np.inf for index, x in enumerate(X): value = self.norm(x) if value > value_max: index_max = index value_max = value return index_max def find_next(self, point, target, X, y): index_min = None value_min = np.inf for index, x in enumerate(X): if self.classify and (y[index] != target): continue value = self.norm(x - point) if value < value_min: index_min = index value_min = value return index_min def fit(self, X, y): X = np.copy(X) y = np.copy(y).flatten() self.paths = {} if self.classify else [] start_index = self.find_start(X) start_value = X[start_index] start_target = y[start_index] X = np.delete(X, start_index, axis=0) y = np.delete(y, start_index, axis=0) while len(X) > 0: next_index = self.find_next(start_value, start_target, X, y) if self.classify and next_index is None: start_index = self.find_start(X) start_value = X[start_index] start_target = y[start_index] continue next_target = y[next_index] if self.classify: if not next_target in self.paths: self.paths[next_target] = [] self.paths[next_target].append({ 'start': start_value, 'next': X[next_index] }) else: self.paths.append({ 'start': start_value, 'next': X[next_index], 'value': start_target, 'target': next_target }) start_value = X[next_index] start_target = y[next_index] X = np.delete(X, next_index, axis=0) y = np.delete(y, next_index, axis=0) if self.classify: self.paths[start_target].append({ 'start': start_value, 'next': self.paths[start_target][0]['start'] }) else: self.paths.append({ 'start': start_value, 'next': self.paths[0]['start'], 'value': start_target, 'target': self.paths[0]['target'] }) return self def predict(self, X): result = [] for x in X: if self.classify: predicted = None min_distance = np.inf for target in self.paths: for path in self.paths[target]: point = x - path['start'] line = path['next'] - path['start'] if np.allclose(self.norm(line), 0): continue direction = line / self.norm(line) product = np.dot(point, direction) projection = product * direction distance = self.norm(projection - point) if distance < min_distance: predicted = target min_distance = distance result.append(predicted) else: predicted = None min_distance = np.inf for path in self.paths: point = x - path['start'] line = path['next'] - path['start'] if np.allclose(self.norm(line), 0): continue direction = line / self.norm(line) product = np.dot(point, direction) projection = product * direction parameter = np.sign(product) * self.norm(projection) /\ self.norm(line) distance = self.norm(projection - point) if distance < min_distance: predicted = (1 - parameter) * path['value'] +\ parameter * path['target'] min_distance = distance result.append(predicted) return np.array(result) def score(self, X, y): if self.classify: return f1_score(y.flatten(), self.predict(X), average='micro') else: return r2_score(y.flatten(), self.predict(X)) 


从理论上(和技术上),可以使predict_proba与1-标准化距离相同。 但是我没有机会真正测试这些概率,所以...

一些测试


我从经典的Boston Housing和Iris开始,对于基线,我选择了Ridge和LogisticRegression。 好吧,怎么办,如果呢。

一般而言,我建议您查看jupyter笔记本

简而言之:回归器效果较差,分类器效果较好。
更新:在StandardScaler之后,回归器工作得更好。

我还骑着综合数据集。 森林里通常有木柴。

但这被注意到:

  1. 回归器在小尺寸的空间中效果很好,
  2. 从某个阈值开始,回归器和分类器均对噪声敏感,
  3. 与生产线不同,回归器怀疑是多模式的(在Boston Housing中),
  4. 通过构造,分类器在线性不可分的卫星集合上效果很好(是所​​有分类中最好的:)。

结论,优点,缺点和适用性


我个人认为当前的实施没有任何优势。 无论从技术上还是数学上。 也许可以将其修改为更明智的方法。 因此,我也看不到任何特定的适用性。 是否可以在不进行预处理的情况下处理非常小的数据...

有许多缺点:需要将整个数据集保留在内存中,泛化能力是基于外推法建立的,主要且唯一的超参数-范数-不适合特殊的选择-枚举。

但是,无论如何,对于我来说,收到的是一个惊喜,我决定在这里分享。

Source: https://habr.com/ru/post/zh-CN429974/


All Articles