_squared_euclidean函数详解:计算两个样本集中两两样本(来自不同样本集)之间的距离

看GLVQ的代码时候,发现下面一段(已经被我拆分了,方便调试),本来不知所云,后来发现,里面文章大得很。

def _squared_euclidean(a, b=None):
    if b is None:
        d = np.sum(a ** 2, 1)[np.newaxis].T + np.sum(a ** 2, 1) - 2 * a.dot(
            a.T)
    else:
        d = np.sum(a ** 2, 1)[np.newaxis].T
        e = np.sum(b ** 2, 1)
        f = d + e
        g = 2 * a.dot(b.T)
        h = f - g
    return np.maximum(h, 0), d, d.shape, e, e.shape, f, f.shape, g, g.shape


a = np.array([[1, 2], [3, 4]])
b = np.array([[2, 3], [4, 1]])
c = _squared_euclidean(a, b)
print(c)

结果为:

C:\anconda3\python.exe C:/hellopytorch/mel_ceshi.py
(array([[ 2, 10],
       [ 2, 10]]), array([[ 5],
       [25]], dtype=int32), (2, 1), array([13, 17], dtype=int32), (2,), array([[18, 22],
       [38, 42]], dtype=int32), (2, 2), array([[16, 12],
       [36, 32]]), (2, 2))

Process finished with exit code 0

比较d,e的形状,我发现了[np.newaxis].T的作用:d本来应该是e的形状,也就是(2,),应该是一个一维的数组,当然只是一行;经过[np.newaxis]之后,增加了一个维度,也就是在最外面加了一对[],形状变为(1, 2),虽然变成了二维数组,依然是一行;紧接着进行了转置.T,形状变成了(2, 1),就变成了最终的形式[[ 5], [25]]
还有很重要的一点是,d + e时候,他们的形状本来是不同的,numpy这个模块中,实现了低维的轴扩展成高维的轴再相加,其实是实现了[[5, 5], [25, 25]] + [[13, 17], [13, 17]],最后的结果就是[[18, 22], [38, 42]]
其实,这个函数想实现的就是两个样本点之间的距离平方和。比如这里就是a, b所包含的两个样本之间的距离,这里各有两个样本,所以产生了四个距离,只不过这里巧了,其中存在距离是一样的。h中第一行表示 a中第一个样点(第一行表示的样本点)与b中第一个和第二个样本点之间的距离。第二行以此类推。
从中get到的一点心得就是,比较复杂的公式,拆成一段一段去分析,化繁为简,或许能有好结果。

这个错误是因为 `scoring='neg_mean_squared_error'` 是一个用于分类任务的评分函数,而你的目标变量是连续变量(回归任务)。所以,你需要使用适合回归任务的评分函数。 对于回归任务,可以使用以下的评分函数: - `neg_mean_absolute_error` - `neg_mean_squared_error` - `neg_root_mean_squared_error` - `r2` 你可以根据你的任务需求选择适合的评分函数。例如,如果你想要评估预测值与真实值之间的平均误差,可以使用 `neg_mean_absolute_error`。如果你想要评估预测值与真实值之间的平均平方误差,可以使用 `neg_mean_squared_error`。 在使用评分函数时,可以参考以下示例代码: ```python from sklearn.model_selection import cross_val_score from sklearn.linear_model import LinearRegression from sklearn.datasets import make_regression # 创建一个回归数据 X, y = make_regression(n_samples=100, n_features=10, random_state=42) # 创建一个线性回归模型 model = LinearRegression() # 使用 neg_mean_squared_error 作为评分函数 scores = cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error') print('neg_mean_squared_error scores:', scores) # 使用 neg_mean_absolute_error 作为评分函数 scores = cross_val_score(model, X, y, cv=5, scoring='neg_mean_absolute_error') print('neg_mean_absolute_error scores:', scores) # 使用 neg_root_mean_squared_error 作为评分函数 from sklearn.metrics import make_scorer, mean_squared_error import numpy as np def root_mean_squared_error(y_true, y_pred): return np.sqrt(mean_squared_error(y_true, y_pred)) rmse_scorer = make_scorer(root_mean_squared_error, greater_is_better=False) scores = cross_val_score(model, X, y, cv=5, scoring=rmse_scorer) print('neg_root_mean_squared_error scores:', scores) # 使用 r2 作为评分函数 from sklearn.metrics import r2_score r2_scorer = make_scorer(r2_score) scores = cross_val_score(model, X, y, cv=5, scoring=r2_scorer) print('r2 scores:', scores) ``` 以上示例代码演示了如何使用不同的评分函数进行交叉验证,并输出每个评分函数的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值