波波老师,我问一下,如果不使用dot方法。

来源:5-4 向量化

爱西瓜同志

2019-03-29

直接对向量进行减法和除法的操作,然后分别对分母和分子进行sum求和,再相除是不是也是可以的呢?如果可以,这样的效率应该和dot方法的效率是类似的吧?

写回答

2回答

liuyubobobo

2019-03-29

抱歉,我没有太理解你的意思,用代码表达一下?

0
1
爱西瓜同志
波波老师,我把代码写在回答里了
2019-03-29
共1条回复

爱西瓜同志

提问者

2019-03-29

一开始是:

    用for循环对对num和d进行赋值

def fit(self, x_train, y_train):
    """根据训练数据集x_train,y_train训练Simple Linear Regression模型"""
    assert x_train.ndim == 1, \
        "Simple Linear Regressor can only solve single feature training data."
    assert len(x_train) == len(y_train), \
        "the size of x_train must be equal to the size of y_train"

    x_mean = np.mean(x_train)
    y_mean = np.mean(y_train)

    num = 0.0
    d = 0.0
    for x, y in zip(x_train, y_train):
        num += (x - x_mean) * (y - y_mean)
        d += (x - x_mean) ** 2

    self.a_ = num / d
    self.b_ = y_mean - self.a_ * x_mean

    return self

后来经过向量化优化:

    def fit(self, x_train, y_train):
    """根据训练数据集x_train,y_train训练Simple Linear Regression模型"""
    assert x_train.ndim == 1, \
        "Simple Linear Regressor can only solve single feature training data."
    assert len(x_train) == len(y_train), \
        "the size of x_train must be equal to the size of y_train"

    x_mean = np.mean(x_train)
    y_mean = np.mean(y_train)

    self.a_ = (x_train - x_mean).dot(y_train - y_mean) / (x_train - x_mean).dot(x_train - x_mean)
    self.b_ = y_mean - self.a_ * x_mean

    return self

这里主要使用了dot方法

我的问题是:

    直接对向量进行加减乘除操作,然后分别对分母和分子进行sum求和,再分母分子相除是不是也是可以的呢?如果可以,这样的效率应该和dot方法的效率是类似的吧?

np.sum((x_train - x_mean)*(y_train - y_mean)) /
 np.sum((x_train - x_mean) * (x_train - x_mean))


0
3
liuyubobobo
回复
weixin_慕的地7337835
我不确定你具体说的事哪一句话,但大概率是不用的。这里的关键是,向量不是矩阵。向量没有第二个维度。一个 n 维向量可以直接和一个 n 维向量“点乘”,这叫向量的内积。当我们说 1 * n 的向量或者对 n * 1 的向量的时候,其实已经把向量当做矩阵看待了。在 numpy 中,一个 1 * n 的矩阵(或者 n * 1 的矩阵)和一个 n 维向量不是一回事儿,前者的维度为 2(虽然有一个维度值为 1),后者维度为 1。
2022-10-24
共3条回复

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5839 学习 · 2437 问题

查看课程