请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

正在回答

2回答

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

0 回复 有任何疑惑可以回复我~
  • 提问者 爱西瓜同志 #1
    波波老师,我把代码写在回答里了
    回复 有任何疑惑可以回复我~ 2019-03-29 15:33:06
提问者 爱西瓜同志 2019-03-29 15:32:38

一开始是:

    用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 回复 有任何疑惑可以回复我~
  • 理解了。可以。效率应该差不多。在现代计算机上差别不大。但理论上你的方法会慢一些。通过调用个数可以看出来。dot是一次调用;但是你的方法需要*, sum两次调用:)
    回复 有任何疑惑可以回复我~ 2019-03-30 01:17:41
  • 波波老师,您好。上述的这个问题里是不是有一个隐方的转换,将行向量变成列向量? 因为1 x n 的矩阵不能和1 x n的矩阵相乘,只能和n x 1 的。
    回复 有任何疑惑可以回复我~ 2022-10-23 14:26:55
  • 我不确定你具体说的事哪一句话,但大概率是不用的。这里的关键是,向量不是矩阵。向量没有第二个维度。一个 n 维向量可以直接和一个 n 维向量“点乘”,这叫向量的内积。当我们说 1 * n 的向量或者对 n * 1 的向量的时候,其实已经把向量当做矩阵看待了。在 numpy 中,一个 1 * n 的矩阵(或者 n * 1 的矩阵)和一个 n 维向量不是一回事儿,前者的维度为 2(虽然有一个维度值为 1),后者维度为 1。
    回复 有任何疑惑可以回复我~ 2022-10-24 02:37:17
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信