def cost(self, x_mat: ndarray, y_row: ndarray) -> float: """ 计算在 x_mat 和 y_row 上的代价。 :param x_mat: 特征向量组,行数 m 表示样本数,列数 n 表示特征数 :param y_row: 输出行向量,每一个值代表 x_mat 中对应行的输出 :return: 代价值。 """ if self._theta is None: raise StateError('not trained yet') self._theta, x_mat = _t.match_theta_x(self._theta, x_mat) x_mat, y_row = _t.match_x_y(x_mat, y_row) if len(self.labels) == 2: return self.__cost(self._theta, x_mat, y_row) else: m = x_mat.shape[0] cost_sum = 0 for i, label in enumerate(self.labels): y = y_row == label cost_sum = cost_sum + np.sum(y) * self.__cost( self._theta[:, i], x_mat, y) / m return cost_sum
def probability(self, x_mat: ndarray) -> Union[ndarray, float]: """ 返回对应于 x_mat 的预测概率。如果是二分类问题,那么返回一个行向量;如果是多分类问题,返回一个 m*num_labels 的矩阵,其中每一行表示样本在每个类上的概率。 :param x_mat: 特征向量组,行数 m 表示样本数,列数 n 表示特征数 :return: 预测概率。 """ if self._theta is None: raise StateError('not trained yet') self._theta, x_mat = _t.match_theta_x(self._theta, x_mat) return _mf.sigmoid(x_mat @ self._theta)
def cost(self, x_mat: ndarray, y_row: ndarray): """ 计算在 x_mat 和 y_row 上的代价。 :param x_mat: 特征向量组,行数 m 表示样本数,列数 n 表示特征数 :param y_row: 输出行向量,每一个值代表 x_mat 中对应行的输出 :return: 代价值 """ if self._theta_row is None: raise StateError('not trained yet') self._theta_row, x_mat = _t.match_theta_x(self._theta_row, x_mat) x_mat, y_row = _t.match_x_y(x_mat, y_row) return self.__cost(self._theta_row, x_mat, y_row)
def predict(self, x_mat: ndarray): """ 使用训练好的参数进行预测。如果提供了特征缩放时的平均值、标准差向量,那么会先将特征值规范化。 :param x_mat: 特征向量组,行数 m 表示样本数,列数 n 表示特征数 :return: 预测结果 """ if self._theta_row is None: raise StateError('not trained yet') self._theta_row, x_mat = _t.match_theta_x(self._theta_row, x_mat) # 正规方程法不需要规范化数据 if self.method == 'gradient' and self.mean_row is not None and self.std_row is not None: x_mat = _dp.feature_normalize(x_mat, mean_row=self.mean_row, std_row=self.std_row)[0] return _t.ret(x_mat @ self._theta_row)
def predict(self, x_mat: ndarray) -> Union[ndarray, int]: """ 返回预测值,是对应于 x_mat 的标记。 :param x_mat: 特征向量组,行数 m 表示样本数,列数 n 表示特征数 :return: 预测标记 """ if self._theta is None: raise StateError('not trained yet') self._theta, x_mat = _t.match_theta_x(self._theta, x_mat) prob = x_mat @ self._theta if len(self.labels) == 2: return _t.ret( _t.convert_y(self.labels, _mf.sigmoid(prob) >= self.threshold, to=False)) else: return _t.ret(self.labels[np.argmax(prob, axis=1)])