瞎转悠 瞎琢磨

在试图实现自己的想法里处处碰壁……
盲目尝试sklearn里的PCA等降维和聚类方法虽然乍一看上去会了,但是其实是没有办法深刻理解应该在什么时候、怎么使用这些方法的。
明白这两点才能进一步去思考应该怎么样让结果变得更好,进行调参等优化?

聚类

首先没有明确的数据集……然后想说就先对用户进行聚类吧,利用movielens-100k里的数据对用户进行聚类。
刚开始把用户看过的电影序列变成一个矩阵还挺困难的……整了挺久,在list和array类型里反复横跳,总觉得很笨但是又没有更好的办法(可能还有bug!)

# coding:utf-8
from sklearn.cluster import KMeans
from sklearn import metrics
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
re=[]
maxlength = 30      # 最长的电影id序列
array1 = np.ones((943, maxlength))  # 已知943个用户…… 首先没有考虑用户活跃度
print array1.shape
with open('u1_rating_sequence.base') as f:  # 
    for i, line in enumerate(f):            # line就是每个循环读一行
        lines = map(int, line.split())      # 分开之后每个str数字转为int
        userid = lines[0]
        item_seq = lines[1::2]              # 只取用户看的电影序列,已经按照时间顺序排好写在文件里了
        item_seq = np.array(item_seq[:maxlength]) # 转为数组。。。
        if len(item_seq) < maxlength:       # 跳过距离小于30的序列,好了,这一行就是[1 1 1 1 1 1 1 1 ……]了…………无语子,bug来了,怎么样可以一行一行添加数组呢?啊,也许可以使用concatenate函数拼接!
            continue
        array1[i,:] = item_seq

好暂时不管这个bug,构建出了一个(943L,30L)的用户特征数组,每一行都是一个样本特征,然后采用sklearn里的cluster对这个数组进行聚类。

maxrange = 50
for ncluster in range(maxrange):
    user_cluster = KMeans(n_clusters=ncluster+2).fit_predict(array1)      # 这里一直报错的原因是ncluster从0开始,range(50)产生0-49的等差列表,而聚类要求的是聚类数≥2,故+2
    k = metrics.calinski_harabaz_score(array1, user_cluster)              # 采用这个CH指数衡量,还有模有样地试了类别数观察k=?的时候CH指数会比较小
    kk.append(k)

plt.scatter(range(maxrange), kk) # 散点图
plt.show()
plt.plot(range(maxrange), kk) # 折线图
plt.show()

乍一看上去还能找到个肘部(k=10~30左右),但是肘部法的纵轴代表代价函数的值,也就是损失……
还兴致勃勃地尝试了PCA降维试图画出聚类结果,好家伙,啥也不是……
而且,KMeans默认采用的是 欧氏距离!!!
上次lx说的时候我还一知半解(基本不解),现在想了一下欧氏距离就是俩向量的空间距离,但是用户1[20, 232, 45, 90]和用户2[21, 230, 44, 100]真的很相近吗?用户1看的电影是喜剧片而用户2看的是悲剧片咋办……?
Q1:用数字代表电影,并作为用户的特征是否有代表性?如果有,应该用什么距离衡量比较合适?余弦相似度合适吗?如果考虑评分是不是余弦相似度就会合适一些?相关性呢?
Q2:现在不考虑用户的信息,我之前还思考了把用户年龄性别评分这些都加上去,但是都是数字,评分的1-5和性别的0、1显然不是一个量纲。
Q3:我希望根据用户的兴趣聚类,电影id序列可以反映出用户兴趣吗?是否需要考虑电影的标签,统计一下用户看的哪种类型的电影最多,并用标签代表用户?
Q4:问题又来了,标签也不能用数字替代吧,应该怎么样通过标签衡量用户的相似性呢?会不会影响推荐的多样性呢?
Q5:可以给每个用户分配一个标签的比例,例如(0.5喜剧+0.3浪漫+0.2冒险),问题来了,还是怎么样通过标签衡量用户的相似性。。多标签分类问题出现了。。至此问题从推荐变成用户画像,我觉得……是一个陌生的领域……

然后就针对聚类的应用和对于特征的选取啊啥的搜索了一下。
如何对用户进行聚类分析?
无一例外都强调想要分析什么qwq 目的是最重要的,然后有针对性地提取特征。特征可以分为个人基本特征(年龄、性别)和行为数据等等,贴两张图。

思考了一下我选择的特征:电影id,我觉得其实就是“兴趣”维度上的特征,分类特征,应该是无序的,但是用数字表示怎么感觉就有序了呢……?一时语塞,我现在无法知道我这样做对不对T T 倾向于不对……

而且在使用对整数数据使用散点图的时候根本看不出“散”啊QAQ 会重叠在一起。

想使用淘宝数据也应该像他一样先进行分析!淘宝用户行为数据分析详解-简书

原文地址:https://www.cnblogs.com/sweetsmartrange/p/12934508.html