基于K-均值的app列表聚类分析优化

目录

一、过滤词表筛选

二、模型更新

三、app类型处理

1. 统计app类型占比

2. 新增app类型特征


基于K-均值的app列表聚类分析中,初步完成用户app列表特征聚类。我们在评估中发现以下几个问题:

  • 某些同类用户app列表出现大量相同的国民app(如支付宝、微信、QQ、腾讯视频等)和系统app(如日志和备份、相机等);
  • 部分app属性对应有app类别,这部分信息没有利用起来;

针对以上问题,主要做了一下优化:

  • 统计app名称词表,挑选top N作为过滤词表;
  • 统计具有app类别占比,如果占比较高(60%以上),则将app名称和app类别均提取为稀疏向量,作为K-均值模型特征,否则还是以app名称作为输入特征;

一、过滤词表筛选

hive(odps/spark) sql统计app名称词表

SELECT  t2.app_name
        ,t2.cnt
        ,t2.updated_client
FROM    (
            SELECT  app_name
                    ,COUNT(1) cnt
                    ,t1.updated_client
            FROM    (
                        SELECT  app_list_json
                                ,updated_client
                        FROM    user_app_list_all_parsed
                        WHERE   dt = '${dt}'
                    ) t1
            LATERAL VIEW EXPLODE(SPLIT(t1.app_list_json, ';')) appTable AS app_name
            GROUP BY app_name
                     ,t1.updated_client
        ) t2
ORDER BY t2.cnt DESC
LIMIT   100
;

筛选出app词表如下

 

app名称countsystem
alipays13370011ios
alipayshare13369783ios
天气12284068android
微信11062865android
QQ10659983android
Pico TTS10636702android
手机淘宝10627003android
支付宝10596229android
网络位置10516984android
指南针10187484android
相册9516585android
tenvideo9307299ios
腾讯视频9204797android
爱奇艺9039991android
抖音短视频8957105android
云服务8838426android
.........

二、模型更新

为了避免国民app和系统app导致用户趋于大同,需要对样本进行过滤处理,如下

    import spark.implicits._
    // 加载textFile
    val df = spark.read.textFile(Constants.SAMPLE).map(row=>{
      val rows = row.split(",")
      AppList(rows(0).toLong,rows(1).split(";").filter(!Constants.APP_FILTER_VOCABULARY.split(",").contains(_)))
    }).toDF("uid","app_list").repartition(numPartitions)

其他过程保持不变。

重新迭代模型,得到ssd随k均值变化趋势,如下

采用手肘法,选取最佳k=26。

三、app类型处理

1. 统计app类型占比

同样采用hive(odps/spark) sql统计app类型占比

SELECT  COUNT(1) cnt
        ,COUNT(DISTINCT t3.app_name) cdnt
FROM    (
            SELECT  t1.app_name
                    ,t2.app_name app_name1
                    ,t1.app_category
            FROM    (
                        SELECT  *
                        FROM    dw_user_app_list_android
                        WHERE   dt = '${dt}'
                    ) t1
            LEFT OUTER JOIN (
                                SELECT  *
                                FROM    app_vocabulary
                                WHERE   dt = '${dt}'
                                AND     updated_client = 3
                            ) t2
            ON      t1.app_name = t2.app_name
        ) t3
WHERE   t3.app_name1 IS NOT NULL;

发现,具有app类型占比仅有1/6,大量数据缺失,不太适合作为聚类特征。

2. 新增app类型特征

假如具有app类型占比在60%以上,可以新增app类型特征处理。如下

    // app_list和app_category_list列转化为稀疏特征向量
    val vectorizerWords = Array("app_list","app_category_list")
    var flag = false
    val cvm = if(!fs.exists(new Path(Constants.COUNTVECTOR))){
      flag = true
      val vectorizers = vectorizerWords.map(col=>{
        new CountVectorizer().setInputCol(col).setOutputCol(col + "_cv").setMinDF(1).fit(df)
      })
      val cvms = new Pipeline().setStages(vectorizers)
      cvms.fit(df)
    }else{
      CountVectorizerModel.load(Constants.COUNTVECTOR)
    }
    if(flag){
      cvm.write.overwrite().save(Constants.COUNTVECTOR)
    }
    val result = cvm.transform(df).select("uid","app_list_cv","app_category_cv")
    result.cache()
    println("countVectorizer处理后分区数量:" + result.rdd.getNumPartitions)
    result.show(10,false)

    // result在Kmeans迭代寻优多次用到,因此加载内存
    val map = new util.HashMap[Int,Double]()
    // k-means聚类
    val ks = Range(minSeq, maxSeq)
    var minSsd = 0.0
    ks.foreach(cluster => {
      val ks = vectorizerWords.map(col=>{
        new KMeans()
          .setK(cluster)
          .setMaxIter(maxIter)
          .setFeaturesCol(col)
          .setPredictionCol(col + "_cv")
      })
      val kmeans = new Pipeline().setStages(ks)
      val kmm = kmeans.fit(result)

参考资料

https://blog.csdn.net/baymax_007/article/details/87986743

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于K-means的深度聚类是一种将K-means算与深度学习相结合的方,用于在高维数据中进行聚类分析。K-means算是一种传统的聚类,它通过迭代计算数据点与簇中心之间的距离,将数据点分配到最近的簇中心,并更新簇中心的位置,直到达到收敛条件。而深度学习是一种机器学习方,通过多层神经网络模型来学习数据的表示和特征提取。 在基于K-means的深度聚类中,首先使用深度学习模型对数据进行特征提取,将原始数据映射到低维空间中。然后,使用K-means算对映射后的数据进行聚类分析,将数据点分配到不同的簇中。这种方可以充分利用深度学习模型学习到的高级特征,提高聚类的准确性和效果。 需要注意的是,基于K-means的深度聚类需要进行适当的参数选择和模型训练,以确保得到合理的聚类结果。同时,由于K-means算对初始簇中心的选择敏感,可能会收敛到局部最小点,因此可以多次运行K-means算,每次使用不同的初始簇中心,以增加算的稳定性和准确性。 总之,基于K-means的深度聚类是一种结合了K-means算和深度学习的方,可以在高维数据中进行聚类分析,并提高聚类的准确性和效果。 #### 引用[.reference_title] - *1* *2* *3* [机器学习算精讲20篇(一)-k-means聚类应用案例(附示例代码)](https://blog.csdn.net/wenyusuran/article/details/119827242)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值