AttributeError: 函数对象没有'dlinreg'属性

1 投票
1 回答
878 浏览
提问于 2025-04-19 11:49

我刚开始学习Python和编程,正在阅读《机器学习:算法视角》这本书。有人告诉我需要对数据进行归一化,把数据分成训练集和测试集,恢复beta向量,然后使用最小二乘误差的和。但是我总是遇到这个错误:

文件 "/Users/shaune/Dropbox/Shaune PhD/auto-mpg.py",第34行,出错位置是:

beta=linreg.linreg(trainin,traintgt)

错误信息是:AttributeError: 'function'对象没有'linreg'这个属性。

我在运行下面的代码时出现了这个问题:

import os
import pylab as pl
import numpy as np

from pylab import *
from numpy import *
import linreg

os.chdir('/Users/shaune/Dropbox/Shaune PhD')
auto=np.loadtxt('auto-mpg.data.txt',comments='"')

#normalise the data
auto=(auto-auto.mean(axis=0))/auto.var(axis=0)

#seperate the training and testing data
trainin=auto[::2,:8]
testin=auto[1::2,:8]
traintgt=auto[::2,1:2]
testtgt=auto[1::2,1:2]

#recover the beta vector
def linreg(trainin,traintgt):
    trainin=np.concatenate((trainin,-np.ones((np.shape(trainin)[0],1))),axis=1)
    beta=np.dot(np.dot(np.linalg.inv(np.dot(np.transpose(trainin),trainin)),np.transpose(trainin)),traintgt)
    traintgt=np.dot(trainin, beta)

#sum of squares error to get predicted values on test set (want small values)
beta=linreg.linreg(trainin,traintgt)
testin=concatenate((testin,-np.ones((np.shape(testin)[0],1))),axis=1)
testout=dot(testin,beta)
error=sum((testout-testtgt)**2)
print error

请帮帮我!谢谢。

1 个回答

1

这个函数的定义

def linreg(trainin,traintgt):

覆盖了你之前导入的名字 linreg,也就是说现在这个名字被新的东西替代了。

import linreg

建议你给这个函数换个名字。注释里提到要 恢复 beta 向量,所以可以考虑用 recover_beta 这个名字。也就是说,把 def 语句改成

def recover_beta(trainin,traintgt):

在你修改的时候,可能还想给这个函数加一个 return 语句。现在这个函数没有返回任何东西。

撰写回答