使用 Python 开发推荐引擎时在赋值错误之前引用了局部变量 'index_three'

local variable 'index_three' referenced before assignment error while developing a recommendation engine using Python

我正在开发一个推荐引擎来向本地零售连锁店推荐商品,我正在使用我在使用电影镜头数据集开发电影推荐系统时学到的代码以及用于推荐的代码电影现在似乎在这里放映不了。

一个函数,获取三级物品之间的相关性

def get_movie_similarity(level3Id):  
    index_three = list(index_three).index(level3Id)
    return corr_matrixthree[index_three]

一个函数,通过将与用户购买的项目相似的项目根据他们的pearson核心分数按升序排列来获得与用户购买最多的项目相似的项目

    def get_movie_recommendations(merged):  
    movie_similarities = np.zeros(corr_matrixthree.shape[0])
    for level3Id in merged:
        movie_similarities = movie_similarities + get_movie_similarity(level3Id)
    similarities_df = pd.DataFrame({'level3Id': index_three,'sum_similarity': movie_similarities})
    similarities_df = similarities_df[~(similarities_df.level3Id.isin(merged))]
    similarities_df = similarities_df.sort_values(by=['sum_similarity'], ascending=False)
    return similarities_df`

我生成的相似度矩阵是用户和他们购买的商品之间的值,其值是您在每个商品上花费的金额。

sample_user = 42140122376
merged[merged.cust_id==sample_user].sort_values(by=['amount_extended'], ascending=False)


sample_user_movies = merged[merged.cust_id==sample_user].level3Id.tolist()  
recommendations = get_movie_recommendations(sample_user_movies)

#We get the top 20 recommended movies
recommendations.level3Id.head(20)

我得到的错误是:

local variable 'index_three' referenced before assignment

Index_three是数据集中所有item的索引 然而,corr_matrix三是使用皮尔逊分数生成的项目之间的相似性矩阵。 合并的是我的数据集

你能帮帮我吗?

我可以分享我在 jupyter notebook 中的代码!

在您定义的每个函数中,您都在使用 index_three 变量。

在函数 get_movie_similarity 中,您正在使用 like -

index_three = list(index_three).index(level3Id)

要使上述声明有效,index_tree 应该有一定的价值。 因此,至少将 index_three 传递给函数,或者如果可以的话将其设为全局。

我上面解释的例子:

def get_str():
"""Give me new string with appending given string with word new"""
    val =  val + "_new"
    return val

print get_str()

当我执行上面的程序时,我会得到如下错误:

C:\Users\dinesh\Desktop>python multi.py
Traceback (most recent call last):
  File "multi.py", line 358, in <module>
    get_str()
  File "multi.py", line 355, in get_str
    val =  val + "_new"
UnboundLocalError: local variable 'val' referenced before assignment

和你一样。我解决了上面的错误如下:

def get_str(val):
    val =  val + "_new"
    return val

print get_str("Dinesh")

C:\Users\dinesh\Desktop>python multi.py
Dinesh_new

注意: 不建议将变量设置为全局变量。

为此,您需要了解变量作用域的工作原理。看看这个!

def my_func():
    index3 =5000
    print(index3)

index3=10;
print(index3)
my_func()

输出:

10
5000

注意: 尽管有两个 index3 你可能会认为它们是一样的。但他们不是

my_func中的index3是局部变量。而你程序中的那个(不在函数中的那个)index3 是不同的!。所以在上面的代码中发生的是首先 print(index3) 在我的代码中打印 index3 (不是在任何函数中..只是在我的程序中)然后 my_func() 被调用并且 print(index3)my_func() 打印 局部变量 index3

看看这个!

def my_func():
    print(index3)

index3=10;
print(index3)
my_func()

输出:

10
10

现在看到两次 index3 是相同的 10 这意味着它打印了两次全局变量。

你的问题来了!:

def my_func():
    index3 =index3+1

index3=10;
print(index3)
my_func()

输出:

10
Traceback (most recent call last):
  File "/home/mr/func.py", line 6, in <module>
    my_func()
  File "/home/mr/func.py", line 2, in my_func
    index3 =index3+1
UnboundLocalError: local variable 'index3' referenced before assignment

为什么?

因为这个 index3 =index3+1 所以当它看到 index3= 时它会创建一个局部变量。所以 index3=0 表示将 0 赋值给局部变量。

不过index3 =index3+1会混淆呢!它认为

等等,你想让我把局部变量 index3 赋值给局部变量 index3+1 吗?但是你还没有声明呢!

def my_func():
    global index3
    index3 =index3+1
    print(index3)

index3=10
print(index3)
my_func()
print(index3)

输出:

10
11
11

现在它采用函数内的 global 值并发生变化。所以 index3 被函数改变了。

注意: 使用全局变量是一种糟糕的编码习惯。

def getIndex3():
    return index3

def my_func():
    index3 = getIndex3()
    index3 =index3+1
    print(index3)

index3=10
print(index3)
my_func()
print(index3)

现在输出:

10
11
10

你猜对了吗?这就是您的程序显示该错误的原因。就是这个意思local variable 'index_three' referenced before assignment