求助!!!!KNN算法中距离公式的相关问题。

最近在做豆瓣书评数据分析,主要使用KNN算法及协同过滤为用户推荐书籍。

现在卡在KNN中计算距离矩阵上,每次计算得到的都是零矩阵。

# -*- coding: utf-8 -*-
#cd /Evns/scrapy3/scripts
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns


sns.set(style="white")
os.chdir(r'D:\Douban')#转换工作地点


douban=pd.read_table("douban.csv",sep="::",names=["user","book","rate"],engine='python')#基本数据douban含有user book rate 
user_count=douban.groupby('user').count()#以用户名分组,同一用户统计为一行
user_count=user_count.sort_values('book',ascending=False)#计算每名读者,读了多少书,进行了多少次评价,可以用观察读者大多读了多少数user_count.book.hist(bins=100)
book_count=douban.groupby('book').count()#以书名分组,同一本书统计为一行  
book_count=book_count.sort_values('user',ascending=False)
user_rate=douban.groupby('user').mean().sort_values('rate',ascending=False)#每个用户的平均打分
book_rate=douban.groupby('book').mean().sort_values('rate',ascending=False)#每本书的被所有读者评价的平均得分
user=user_count.copy()
user['rate']=user_rate['rate']#处理数据 表格为每个用户读了多少书,对所有书的平均打分
user['min']=douban.groupby('user').min()['rate']
user['max']=douban.groupby('user').max()['rate']
user['median']=douban.groupby('user').median()['rate']
user['std']=douban.groupby('user').std()['rate']#计算出用户分数的最大值、最小值、均值、方差
#经过上面一步user表单中为每个用户 读了多少数,做了多少次评价,评价的最大值、最小值、中位数、方差
book=book_count.copy()
book['rate']=book_rate['rate']
book['max']=douban.groupby('book').max()['rate']
book['min']=douban.groupby('book').min()['rate']
book['median']=douban.groupby('book').median()['rate']
book['std']=douban.groupby('book').std()['rate']
#经过上面一步book表单中为每本书 被多少读者读过,被评价过多少次,被评价的最大值、最小值、中位数、方差
#选取核心数据进行分析
usercore=user.iloc[0:1915,0:2]
usercore.columns=['bookcount','userrate']#每个用户读了多少书,所有书的平均评价
bookcore=book.iloc[0:399,0:2]
bookcore.columns=['usercount','bookrate']#被多少用户读过,书的平均得分
doubancore1=pd.merge(douban,usercore,left_on='user',right_index=True)#
doubancore=pd.merge(doubancore1,bookcore,left_on='book',right_index=True)
doubancore.head()
'''
doubancore中的列的意思
user:用户姓名 book:书的ID rate:每个用户对书的评价
bookcount:用户评价了多少本书 userrate:用户对所有书的平均评价  usercount:这本书被多少人看过
bookrate:书的总评价
'''
#usercore, bookcore, doubancor
len(doubancore.user.unique())
len(doubancore.book.unique())
ubrcore=doubancore.pivot('user','book','rate')
ubrcore.fillna(value=0)
m,n=ubrcore.shape
#====================================================
#计算核心读者之间的余弦相似性
#calculate user distance matrix
userdist=np.zeros([m,m])
for i in range(m):
    for j in range(m):
        userdist[i,j]=np.dot(ubrcore.iloc[i,],ubrcore.iloc[j,])\
        /np.sqrt(np.dot(ubrcore.iloc[i,],ubrcore.iloc[i,])\
        *np.dot(ubrcore.iloc[j,],ubrcore.iloc[j,]))#计算相似余弦性
        

userdistdf=pd.DataFrame(userdist,index=list(ubrcore.index),columns=list(ubrcore.index))

也考虑过计算公式错误,根据这个网页上的公式换个也是不行。

        https://zhuanlan.zhihu.com/p/21354489?utm_source=qq&utm_medium=social


求大神帮忙看一看。

猜你喜欢

转载自blog.csdn.net/qq_33909862/article/details/80054616