详解数据挖掘

news2024/12/28 5:00:58

        数据挖掘(Data Mining),又译为资料探勘、数据采矿,是数据库知识发现(Knowledge-Discovery in Databases,简称:KDD)中的一个步骤。数据挖掘主要是指从大量的数据中,通过算法自动搜索隐藏于其中的特殊关系型信息的过程。在技术层面上,数据挖掘涉及从大量的、不完全的、有噪声的、模糊的和随机的数据中,提取出隐含的、事先未知的但具有潜在价值和有用信息的过程。

        数据挖掘通常与计算机科学紧密相关,它利用统计、在线分析处理、情报检索、机器学习、专家系统(依靠过去的经验法则)和模式识别等多种方法来实现其目标。数据挖掘过程涵盖了从定义目标、获取数据、数据探索(包括数据质量分析和数据特征分析)到数据预处理(包括数据清洗、数据集成、数据变换和数据规约)等一系列步骤。

        数据挖掘目前是人工智能和数据库领域研究的热点问题,其应用领域广泛,包括情报检索、情报分析、模式识别等。通过高度自动化地分析企业的数据,数据挖掘能够做出归纳性的整理,从中挖掘出潜在的模式,从而帮助决策者调整市场策略,减少风险。

        数据挖掘技术融合了统计学、人工智能、模式识别、机器学习、数据库和可视化技术等多个领域的知识和方法,使得人们能够更有效地从海量数据中提取有价值的信息和知识。随着技术的不断发展,数据挖掘将在更多领域发挥重要作用,为决策提供更加科学、准确的支持。  

        而在大数据的比赛中数据挖掘占有非常中要的地位,但也是最为困难的模块,通常数据挖掘模块与能否进入国赛有很大的关联。        

        以下是相应的代码:

  1. 根据Hive的dwd库中相关表或MySQL中shtd_store中相关表(order_detail、sku_info),计算出与用户id为6708的用户所购买相同商品种类最多的前10位用户(只考虑他俩购买过多少种相同的商品,不考虑相同的商品买了多少次),将10位用户id进行输出,若与多个用户购买的商品种类相同,则输出结果按照用户id升序排序,输出格式如下,将结果截图粘贴至客户端桌面【Release\任务C提交结果.docx】中对应的任务序号下;

结果格式如下:

-------------------相同种类前10的id结果展示为:--------------------

1,2,901,4,5,21,32,91,14,52

package com.rmx.gz.spark.gz2.excavate

import org.apache.log4j.{Level, Logger}
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.feature.{OneHotEncoder, StandardScaler, VectorAssembler}
import org.apache.spark.ml.linalg.{DenseVector, SparseVector}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.expressions.UserDefinedFunction
import org.apache.spark.sql.functions.{asc, avg, col, desc, udf}
import org.apache.spark.sql.types.DoubleType
import org.apache.spark.sql.{DataFrame, Row, SparkSession, functions}

import java.util.Properties
import scala.+:

/**
 * 数据挖掘
 */
object Excavate {
  val mysqlUrl = "jdbc:mysql://bigdata1:3306/ds_pub?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true"
  System.setProperty("HADOOP_USER_NAME", "root")
  Logger.getLogger("org").setLevel(Level.ERROR)

  def main(args: Array[String]): Unit = {
    val sparkSession = SparkSession.builder()
      .master("local[*]")
      .appName("extraction")
      .config("spark.hadoop.dfs.client.use.datanode.hostname", "true")
      .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
      .enableHiveSupport()
      .getOrCreate()
    val mysqlProperties: Properties = new Properties()
    mysqlProperties.setProperty("user", "root")
    mysqlProperties.setProperty("password", "123456")
    val order_info = sparkSession.read.jdbc(mysqlUrl, "order_info", properties = mysqlProperties)

    val sku_info = sparkSession.read.jdbc(mysqlUrl, "sku_info", properties = mysqlProperties)

    val order_detail = sparkSession.read.jdbc(mysqlUrl, "order_detail", properties = mysqlProperties)

    val user_info = sparkSession.read.jdbc(url = mysqlUrl, table = "user_info", properties = mysqlProperties)

    /**
     * 宽表,普通join连接,剔除事实表中不存在现有维表中的记录
     */
    val width_table = order_info
      .join(order_detail, order_detail("order_id") === order_info("id"))
      .join(sku_info, sku_info("id") === order_detail("sku_id"))
      .join(user_info, order_info("user_id") === user_info("id"))

    /**
     * 与用户id为6708的用户所购买相同商品最多的前10位用户
     */
    // 用户8880购买过的商品(去重)
    val user8880BuySkuIds = width_table
      .filter(order_info("user_id") === 8880L)
      .select(order_detail("sku_id"))
      .dropDuplicates("sku_id")
      .collect()
      .map(row => row.getLong(0))
    // 与用户id为8880的用户所购买相同商品最多的前10位用户
    val top10User = width_table
        .filter(order_info("user_id") =!= 8880L && order_detail("sku_id").isin(user8880BuySkuIds: _*))
      .select(order_info("user_id"), order_detail("sku_id"))
      .dropDuplicates("user_id", "sku_id")
      .groupBy("user_id")
      .agg(functions.count("*").as("count"))
      .orderBy(desc("count"), asc("user_id"))
      .limit(10)
      .collect()
      .map(row => row.getLong(0))

    println("-------------------相同种类前10的id结果展示为:--------------------")
    println(top10User.mkString(","))

    /**
     * 商品表信息预处理
     */
    val sku_dimension_table = width_table
      .select(sku_info("*"),order_info("user_id"))
      .drop("sku_name", "sku_desc", "sku_default_img")
      .filter(col("id").isin(user8880BuySkuIds: _*) || col("user_id").isin(top10User: _*))
      .dropDuplicates( "id")


    val assemblerPrice = new VectorAssembler().setInputCols(Array("price")).setOutputCol("vector_price")
    val scalerPrice = new StandardScaler().setInputCol("vector_price").setOutputCol("standard_price")
    val assemblerWeight = new VectorAssembler().setInputCols(Array("weight")).setOutputCol("vector_weight")
    val scalerWeight = new StandardScaler().setInputCol("vector_weight").setOutputCol("standard_weight")
    val oneHotEncoder = new OneHotEncoder()
      .setInputCols(Array("spu_id", "tm_id", "category3_id"))
      .setOutputCols(Array("one_hot_spu_id", "one_hot_tm_id", "one_hot_category3_id"))
      .setDropLast(false)

    // 处理管道
    val pipeline = new Pipeline()

    val pretreatment_sku_info = pipeline
      .setStages(Array(assemblerPrice, assemblerWeight, scalerPrice, scalerWeight, oneHotEncoder))
      .fit(sku_dimension_table)
      .transform(sku_dimension_table)
    // 稀疏向量转值数组
    val sparseVectorToArray = udf { x: SparseVector => x.toArray }
    // 稠密向量转数组
    val denseVectorToArray = udf { x: DenseVector => x.toArray }

    import sparkSession.implicits._

    val task2Show = pretreatment_sku_info
      .orderBy("id")
      .limit(1)
      .select(
        col("id").cast(DoubleType) +:
          denseVectorToArray(col("standard_price"))(0).as("price") +:
          denseVectorToArray(col("standard_weight"))(0).as("weight") +:
          ((0 until 12).map((i: Int) => sparseVectorToArray(col("one_hot_spu_id"))(i) as s"spu_id#${i + 1}") ++
            (0 until 7).map((i: Int) => sparseVectorToArray(col("one_hot_tm_id"))(i) as s"tm_id#${i + 1}") ++
            (0 until 803).map((i: Int) => sparseVectorToArray(col("one_hot_category3_id"))(i) as s"category3_id#${i + 1}")): _*
      )

    val elements = task2Show
      .limit(1)
      .select(task2Show.columns.slice(0, 10).map(col(_: String)): _*)
      .collect()
      .head
    println("--------------------第一条数据前10列结果展示为:---------------------")
    println(elements.mkString(","))

    /**
     * 推荐
     */
    val cosineSimilarity: UserDefinedFunction = udf((v1: SparseVector, v2: SparseVector) => {
      //分子
      val member: Double = v2.toArray.zip(v1.toArray).map((num: (Double, Double)) => num._1 * num._2).sum
      // 分母
      val temp1: Double = math.sqrt(v2.toArray.map((num: Double) => math.pow(num, 2)).sum)
      val temp2: Double = math.sqrt(v1.toArray.map((num: Double) => math.pow(num, 2)).sum)
      val deno: Double = temp1 * temp2
      //余弦
      member / deno
    })
    val sku_vector: DataFrame = new VectorAssembler()
      .setInputCols(Array("standard_price", "standard_weight", "one_hot_spu_id", "one_hot_tm_id", "one_hot_category3_id"))
      .setOutputCol("vector")
      .transform(pretreatment_sku_info)
      .select("id", "vector")
    val user_8880_sku_info = sku_vector
      .filter(col("id").isin(user8880BuySkuIds: _*))
      .select(col("vector").as("v1"))

    val result = sku_vector
      .filter(!col("id").isin(user8880BuySkuIds: _*))
      .crossJoin(user_8880_sku_info)
      .withColumn("cosineSimilarity", cosineSimilarity(col("vector"), col("v1")))
      .groupBy("id")
      .agg(avg("cosineSimilarity") as "cosineSimilarity")
      .orderBy(desc("cosineSimilarity"))


    val tuples: Array[(String, String)] = result
      .collect()
      .map((r: Row) => (r(0).toString, r(1).toString))
      .slice(0, 6)
    println("------------------------推荐Top5结果如下------------------------")
    for (i <- tuples.indices) {
      println(s"相似度top${i + 1}(商品id:${tuples(i)._1},平均相似度:${tuples(i)._2})")
    }

  }
}

        近年来,数据挖掘引起了信息产业界的极大关注,其主要原因是存在大量数据,可以广泛使用,并且迫切需要将这些数据转换成有用的信息和知识。获取的信息和知识可以广泛用于各种应用,包括商务管理、生产控制、市场分析、工程设计和科学探索等。数据挖掘利用了来自如下一些领域的思想:①来自统计学的抽样、估计和假设检验;②人工智能、模式识别和机器学习的搜索算法、建模技术和学习理论。数据挖掘也迅速地接纳了来自其他领域的思想,这些领域包括最优化、进化计算、信息论、信号处理、可视化和信息检索。一些其他领域也起到重要的支撑作用。特别地,需要数据库系统提供有效的存储、索引和查询处理支持。源于高性能(并行)计算的技术在处理海量数据集方面常常是重要的。分布式技术也能帮助处理海量数据,并且当数据不能集中到一起处理时更是至关重要。

数据挖掘的系统结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1509633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选择软文推广渠道?媒介盒子分享

想要做好一个品牌&#xff0c;除了软文文案、推广方式要不断更新外&#xff0c;软文推广渠道也十分重要。有许多企业在创立之初容易踩平台没选好的坑。渠道是品牌触达用户的关键点&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;如何选择软文发布平台。 一、 了解平台用户…

Java项目:47 ssm007亚盛汽车配件销售业绩管理统+jsp(含文档)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 亚盛汽车配件销售业绩管理系统根据调研&#xff0c;确定管理员管理客户&#xff0c;供应商&#xff0c;员工。 管理配件和配件的进货以及出售…

Python中的异常处理及最佳实践【第125篇—异常处理】

Python中的异常处理及最佳实践 异常处理是编写健壮、可靠和易于调试的Python代码中不可或缺的一部分。在本文中&#xff0c;我们将深入探讨Python中的异常处理机制&#xff0c;并分享一些最佳实践和代码示例&#xff0c;以帮助您更好地处理错误情况和提高代码的稳定性。 异常…

VUE3项目学习系列--Axios二次封装(五)

Axios中文文档 | Axios中文网 (axios-http.cn) Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequ…

【SpringCloud微服务实战01】Eureka 注册中心

前言 在 Eureka 架构中,微服务角色有两类: EurekaServer :服务端,注册中心 记录服务信息 心跳监控 EurekaClient :客户端 Provider :服务提供者,例如案例中的 user-service 注册自己的信息到 EurekaS…

java SSM在线学习网站系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM在线学习网站系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用…

ubuntu搭建HTTP/3 协议的 Nginx QUIC

ubuntu搭建HTTP/3 协议的 Nginx QUIC 什么是 HTTP/3 和 QUIC&#xff1f; HTTP/3 是一种基于 QUIC (Quick UDP Internet Connections) 协议的 HTTP 协议版本&#xff0c;它是 HTTP/2 的后继者&#xff0c;旨在改进 Web 性能和安全性。 HTTP/3 与之前的 HTTP 协议有很大的不同…

谷粒商城实战(004 整合elasticSearch(es)搜索引擎)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第125p-第p127的内容 整合es 最好使用Eleasticsearch-Rest-Client 24年改用Java API Client 其实可以直接用js直接调用es 进行查询&#xff0c;这…

力扣大厂热门面试算法题 12-14

12. 整数转罗马数字&#xff0c;13. 罗马数字转整数&#xff0c;14. 最长公共前缀&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.11 可通过leetcode所有测试用例。 目录 12. 整数转罗马数字 解题思路 完整代码 Java Pytho…

5G CA频段组合与带宽的射频标准

先来复习一下我们前面学习过的章节后缀所代表的含义&#xff1a; None Single CarrierA Carrier Aggregation (CA)B Dual-Connectivity (DC)C Supplement Uplink (SUL)D UL MIMOE V2XF Shared spectrum channel accessG Tx Diversity (TxD)I …

【MySQL探索之旅】数据表的基本操作(附带思维导图)

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &…

maven运行spring boot项目

我用idea想跑一个整合flowable的spring boot项目&#xff0c;但是跑不起来&#xff0c;原因是jdk版本不够高。但是我的idea是2018版本&#xff0c;最高只能支持到jdk11。就想办法不用idea编译、打包、运行项目。因为spring boot是maven项目&#xff0c;所以可以用maven进行打包…

04-微服务 面试题

1.Spring Cloud 常见的组件有哪些? Spring Cloud 5大组件有哪些? 基础的内容考察回答原则:简单的问题不能答错(一道面试题就能淘汰一个人)新手和老手都要注意面试参考回答: 面试官:Spring Cloud 5大组件有哪些? 候选人:早期我们一般认为的Spring Cloud五大组件是 …

EXCEL根据某列的数字N,增加N-1行相同的数据

因为工作需要&#xff0c;需要将表格数据拆分&#xff0c;类似于相同的订单有6笔&#xff0c;数据表中就是一行数据但是订单数为6&#xff0c;但是需要将其拆分成相同6笔的订单数为1的数据行。 需要使用VBA代码&#xff0c;具体做法如下&#xff1a; Dim i As Long, j As Long…

web3D三维引擎(Direct3D、OpenGL、UE、U3D、threejs)基础扫盲

Hi&#xff0c;我是贝格前端工场的老司机&#xff0c;本文介绍文web3D的几个引擎&#xff0c;做个基础扫盲&#xff0c;如果还不能解决问题&#xff0c;可以私信我&#xff0c;搞私人订制呦。 三维引擎是指用于创建和渲染三维图形的软件框架。它们通常提供了图形处理、物理模拟…

Springboot+vue的疫情管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的疫情管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

蓝桥杯2019年第十届省赛真题-修改数组

查重类题目&#xff0c;想到用标记数组记录是否出现过 但是最坏情况下可能会从头找到小尾巴&#xff0c;时间复杂度O(n2)&#xff0c;数据范围106显然超时 再细看下题目&#xff0c;我们重复进行了寻找是否出现过&#xff0c;干脆把每个元素出现过的次数k记录下来&#xff0c;直…

基于PHP的数字化档案管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的数字化档案管理系统 一 介绍 此数字化档案管理系统基于原生PHP&#xff0c;MVC架构开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 php(mvc)mysqlbootstrapphpstudyvscode 二 功能 …

C#请假与加班案例

请假余额表示一年当中可以请几天假。输入请假天数&#xff0c;点击请假按钮则减少假期余额。如果请假天数大于当前假期余额&#xff0c;则提示“假期余额不足”。输入加班天数&#xff0c;点击加班按钮则增加假期余额。 private void button1_Click(object sender, EventArgs e…

php导出excel文件

环境 php7.4hyperf3composer require phpoffice/phpspreadsheet代码 class IndexController extends AbstractController { /*** Inject* var Picture*/private $picture;public function index(){$res_data[]["robot" > 哈哈机器人,"order" > TES…