数据挖掘资料(问答)


第一章

1.什么是数据挖掘?

数据挖掘是指从大量有噪声的,不完全的,模糊的和随机的数据中,提取出于隐含在其中的事先不知道但存在利用价值的信息的过程。
包含的三个含义 :
1.数据必须是真实的,大量的且含有噪声的;
2.发现的是用户感兴趣的,可以接受,理解和运用的知识;
3.仅支持特定的问题,并不要求放之四海皆准的知识。


2.简述数据挖掘的过程。

1.确定业务对象;
2.数据准备;
3.数据的选择;
4.数据的预处理;
5.数据的转换;
6.数据挖掘;
7.结果分析;
8.知识的同化。

3.简述使用Python进行数据挖掘的优势。

  1. 爬取数据需要python;
  2. 数据分析需要python;
  3. python语言简单高效。

4.当前主流的数据挖掘工具有哪些?

商用工具:SAS Enterprise MinerIBM SPSS ModekerIBM Intelligent Miner
开源工具:R语言PythonWEKARapidMiner

5.简述数据分析与数据挖掘之间的关系。

相同点:他们都是基于搜集的数据,应用数学、统计额计算机等技术抽取出数据中的有用信息,进而为决策提供依据和指导方向。
不同点:

差异 数据分析 数据挖掘
定义 描述和探索性分析,
评估现状和修正不足
技术性的“采矿”过程,
发现未知的模式和规律
侧重点 实际的业务知识 挖掘技术的落地,
完成“采矿”过程
技能 统计学、数据库、Excel
和数据可视化
过硬的数学功底
和编程技术
结果 需结合业务知识解读统计结果 模型或规则

答案2:
区别:
数据分析 处理的数据量一般不会太大,其具有明确的目标,主要侧重于展现数据间的关系;数据挖掘则是对海量数据进行挖掘,通常在开始时不能明确知道将发现什么样的知识,主要着眼于结合数学模型从现有数据中预测和估计未来情况。
联系:
1.数据分析的结果需要进一步挖掘;
2.数据挖掘发现知识的过程需要对先验约束做调整后再次进行数据分析;
3.数据分析从数据中找到信息,数据挖掘则从信息中发现知识;
4.从数据中挖掘知识的过程需要 二者相互配合。

6.数据挖掘的主要任务有哪些?

关联分析:关联规则挖掘(两个或两个以上变量的取值之间存在关联);
数据建模预测:数据预测建模是根据已知的数据构建一个数据模型,然后应用这个模型对未知数据的所属分类进行预测;
聚类分析:聚类 是把数据按照相似性归纳成若干类别,使同一类中的数据彼此相似,不同类中的数据尽量相异;
离群点检测:离群点是指全局或局部范围内偏离一般水平的观测对象,离群点的异常值会对数据分析和数据挖掘产生不良影响。

7.数据挖掘的任务。

分类、聚类、回归、关联分析、离群点检测、演化分析,序列模式

8.数据的三个重要特征。

维度、稀疏性、分辨率

2.第三章

1.简述标称属性的相似度 评价方法:

1.简单匹配(众数、相等)
2.二值属性的邻近性度量

2.填空

数据集由数据对象组成,一个数据对象代表一个实体
属性的类型: 标称(其值是一些符号或者是事务的名称)二进制序数区间标度比例标度

数据对象的别名:
样品、实例、元组、对象

属性的别名:
维度、特征、字段

高维属性指的是:数据属性很多

平均数>中位数>众数

四分位极差:反映了中间50%数据的离散程度,越小越集中,越大越分散

是所谓特征选择,是指:从数据中选择有代表性的数据。

3.第四章

1.数据处理为何要进行数据变换?数据变换的主要方法有哪些?

在数据预处理中,不同的数据适合不同的数据挖掘算法,数据变换是一种将原始数据变换成较好数据格式的方法,以便作为数据处理前特定数据挖掘算法的输入。
数据变换的主要方法:
1.光滑:数据光滑用于去除数据中的噪声,常用数据光滑方法有分箱、回归和聚类等;
2.属性构造:通过给定的属性构造新的属性并添加到属性集中,以帮助数据挖掘;
3.聚类:对数据进行汇总或聚集;
4.规范化:把属性数据按比例缩放使之落入一个特定的小区间;
5.离散化:分箱离散化、直方图离散化、聚类决策树和相关性分析离散化;
6.由标称数据产生概念分层。

2.请分别介绍均值、中位数和截断均值在反应数据中心方面的特点。

均值是描述数据的最常用的单个度量方法,但通常不是度量数据中心的最好方法;
中位数:对于倾斜的(非对称)数据,中位数是数据中心的一个较好度量;
截断均值:均值对极端值很敏感,截断均值可以避免少量极端值影响均值。

3.数值属性的相似性度量方法有哪些?各自的优缺点是什么?

相似性度量方法 优点 缺点
欧氏距离 使用简单,等于两点距离 所计算的距离可能会根据要素单位发生倾斜随着数据维度的增加,欧氏距离 用处越小
闵可夫斯基距离 将各个分量的量纲(单位)相同看待了;
未考虑各个分量的分布(期望、方差等)可能是不同的
曼哈顿距离 计算速度快 它不是可能的最短路径,比欧氏距离可能给出高值
切比雪夫距离 只要计算加减法即可,大大提高了运算速度 通常用于非常特殊的使用情况,很难作为一个通用的距离度量
汉明距离 两个向量长度不等时,难以使用

4.在数据清洗中,处理数据缺失值的方法有哪些?如何去掉数据中的噪声?

处理数据缺失值的方法:
1.忽略元组;
2.人工填写缺失值;
3.使用一个全局常量填写缺失值;
4.使用属性的中心趋势度量填充缺失值;
5.使用最可能的值填充缺失值;
6.使用与给定元组属于同一类的所有样本的属性均值或中位数填充缺失值。
去掉数据的噪声方法:
1.分箱法:考察数据的“近邻”(周围的值)来光滑有序数据值;
2.回归法:用一个函数拟合数据来光滑数据;
3.离群点分析法:通过聚类等方法检测离群点。

4.第五章

1.简述回归分析的含义及常用的回归分析方法。

含义:
回归分析是一种预测性的建模技术,它研究的是因变量(目标)与自变量(预测期)之间的关系。它是利用数据统计原理,对大量统计数据进行数学处理,并确定因变量与某写自变量的相关关系,建立一个相关性较好的回归方程(函数表达式),并加以外推,用于预测今后因变量变化的分析。回归分析通常用于预测分析时间序列模型以及发现变量之间的因果关系。
常用的回归分析方法:
线性回归、逻辑回归、多项式回归和岭回归等

2.简述逻辑回归的含义及主要过程。

逻辑回归算法是一种广义的线性回归分析方法,它仅在线性回归算法的基础上,利用sigmoid函数对事件发生的概率进行预测。
主要过程:在线性回归中可以得到一个预测值,然后将该值通过逻辑函数进行转换为概率值,在根据概率值进实现分类。

5.第六章

1.将关联规则挖掘任务。

1.频繁项集产生。其目标是发现满足最小支持度阈值的所有项集,这些项集成为频繁项集;
2.规则的产生。从频繁项集中提取所有置信度的规则这些规则成作墙规则

2.简述Apriori算法的优点和缺点。

优点:
使用Apriori性质来生产候选项集的方法,大大压缩了频繁集的大小,取得了很好的性能。
缺点:很要很大的I/O负载,可能产生庞大的数据集;采用唯一支持度;算法的适应面窄;

6.第七章

1.简述K临近算法的的主要思想,并给定最近邻数K和描述每个元组的属性数,写一个K最近邻分类算法。

算法思想:
给定训练数据集,实例类别以定,再对目标实例进行分类时,我们根据与目标实例K个最近邻的训练实例的类别,通过多数表决的方式进行决定。

2.朴素贝叶斯中的“朴素 ”有何含义?简述朴素贝叶斯分类的主要思想及其优缺点。

“朴素”含义:
说明这个算法的简易性。该算法基于一个很朴素的假设:所有变量都是 相互独立的。假设个特征之间相互独立,各特征属性是条件独立的。
主要思想:
基于贝叶斯概率的思想,假设属性之间相互独立。
优点:
1.有稳定分类效率;
2.对规模小的数据表现很好,能够处理多分类 任务,适合 增量式训练
3.对缺失数据比较敏感,算法比较简单
缺点:
1.该算法的假设条件在现实中一般不成立,在属性个数比较多或者属性之间相关系数比较大时,分类效果不好;
2.需要知道先验概率,且先验概率很多时候取决于假设导致预测效果不佳;
3.对输入数据的表达式很敏感。

7.第八章

1.什么是聚类?简单描述聚类分析中的划分方法,基于层次的划分方法和基于密度的方法。

聚类 是一个将数据对象集划分为多个组或族的过程,使簇内的数据对象具有很高的相似性,但不同簇间的对象具有很高的相异性。
划分方法:
基于距离判断数据对象相似度通过不断迭代,将含有多个数据对象的数据集划分成若干个簇,使每个数据对象都属于且只属于一个簇,同时聚类的簇的总数小于数据对象的总数目。
基于层次的方法:
分为
凝聚
的方法和分裂的方法,凝聚的方法也称自底向上的方法,开始将每个对象作为单独的一类 ,逐渐与相似的对象合并,直到满足聚类的目标;分裂的方法称为自顶向下的方法,将所有的数据对象作为一个整体,逐渐划分为簇,以满足聚类条件。
基于密度的方法
使用密度的概念聚类对象,一种类型的方法是DBSCAN算法,它使用基于中心的方法定义相似,根据邻域中对象的密度来生成簇。

2.编程实现K-Means算法,选定某数据集,设置3组不同的K值,3组不同的初始中心点进行实验比较,并讨论设置什么样的初始中心可以改善聚类 效果。

# coding=utf-8
# author:yjy
# date:2019/12/1

import numpy as np  # 扩展程序库,针对数组运算提供大量的数学函数库
import pandas as pd  # 加强版numpy,pandas拥有种数据结构:Series和DataFrame
import matplotlib.pyplot as plt  # 绘图库,一种 MatLab 开源替代方案
import random  # 随机数模块
import time  # 时间模块,时间戳时间: float数据类型,给机器用

# 西瓜数据集4.0: 密度 含糖率 标签
data = [[0.697, 0.460, 1],
        [0.774, 0.376, 1],
        [0.634, 0.264, 1],
        [0.608, 0.318, 1],
        [0.556, 0.215, 1],
        [0.430, 0.237, 1],
        [0.481, 0.149, 1],
        [0.437, 0.211, 1],
        [0.666, 0.091, 0],
        [0.243, 0.267, 0],
        [0.245, 0.057, 0],
        [0.343, 0.099, 0],
        [0.639, 0.161, 0],
        [0.657, 0.198, 0],
        [0.360, 0.370, 0],
        [0.593, 0.042, 0],
        [0.719, 0.103, 0],
        [0.359, 0.188, 0],
        [0.339, 0.241, 0],
        [0.282, 0.257, 0],
        [0.748, 0.232, 0],
        [0.714, 0.346, 1],
        [0.483, 0.312, 1],
        [0.478, 0.437, 1],
        [0.525, 0.369, 1],
        [0.751, 0.489, 1],
        [0.532, 0.472, 1],
        [0.473, 0.376, 1],
        [0.725, 0.445, 1],
        [0.446, 0.459, 1]]

# 多维数组中创建DataFrame(二维表),需要为DataFrame赋值columns和index(默认为数字)
column = ['density', 'sugar_rate', 'label']
dataSet = pd.DataFrame(data, columns=column)

# 创建类K_means
class K_means(object):
    # 创建__init__方法,在面向对象编程中,给未来创建的对象所定义的进行初始化属性
    # 当对象一旦被创建,Python将会自动调用__init__方法,里面的属性将会赋予这个对象
    def __init__(self, k, data, loop_times, error):  # self只有在类的方法中才会有,指向类的实例对象,而非类本身
        self.k = k
        self.data = data
        self.loop_times = loop_times
        self.error = error

    def distance(self, p1, p2):
        # linalg=linear(线性)+algebra(代数),norm则表示范数
        # 求p = 2 时的闵可夫斯基距离,即欧氏距离
        return np.linalg.norm(np.array(p1) - np.array(p2))

    def fitting(self):
        time1 = time.perf_counter()  # 返回性能计数器的值(以分秒为单位),表示程序开始运行到调用这个语句所经历的时间
        mean_vectors = random.sample(self.data, self.k)  # 随机选取k个初始样本
        initial_main_vectors = mean_vectors
        for vec in mean_vectors :
            plt.scatter(vec[0], vec[1], s=100, color = 'black', marker='s')  # 画出初始聚类中心,以黑色正方形(square)表示

        times = 0
        # map(),高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回
        # lambda:返回可调用的函数对象,通常是在需要一个函数,但又不想命名一个函数时使用,lambda x : [x] 表示输入x,输出为[x]
        clusters = list(map((lambda x:[x]), mean_vectors))
        while times < self.loop_times:
            change_flag = 1  # 标记簇均值向量是否改变
            for sample in self.data:
                dist = []
                for vec in mean_vectors:
                    dist.append(self.distance(vec, sample))  # 计算样本到每个聚类中心的距离
                clusters[dist.index(min(dist))].append(sample)  # 找到离该样本最近的聚类中心,并将它放入该簇

            new_mean_vectors = []
            for c,v in zip(clusters, mean_vectors):  # zip()将两个对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
                cluster_num = len(c)
                cluster_array = np.array(c)
                new_mean_vector = sum(cluster_array) / cluster_num  # 计算出新的聚类簇均值向量
                mean_vector = np.array(v)
                # np.divide和np.true_divide结果一样(python3.7.2),np.floor_divide只保留整数结果
                # all(iterable):如果iterable(元组或者列表)的所有元素不为0、False或者iterable为空,all(iterable)返回True,否则返回False
                if all(np.true_divide((new_mean_vector - mean_vector), mean_vector) < np.array([self.error, self.error])):
                    new_mean_vectors.append(mean_vector)  # 均值向量未改变
                    change_flag = 0
                else:
                    # dataFrame转List(),括号不能忘
                    new_mean_vectors.append(new_mean_vector.tolist())  # 均值向量发生改变

            if change_flag == 1:
                mean_vectors = new_mean_vectors
            else:
                break
            times += 1
        time2 = time.perf_counter()
        # str.format(),基本语法是通过 {} 和 : 来代替以前的 %
        print ('本次选取的{}个初始向量为{}'.format(self.k, initial_main_vectors))
        print ('共进行{}轮'.format(times))
        print ('共耗时{:.2f}s'.format(time2 - time1))  # 取2位小数
        for cluster in clusters:
            x = list(map(lambda arr: arr[0], cluster))
            y = list(map(lambda arr: arr[1], cluster))
            plt.scatter(x, y, marker = 'o', label = clusters.index(cluster)+1)

        plt.xlabel('密度')
        plt.ylabel('含糖率')
        plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
        plt.legend(loc='upper left')

        plt.show()

for i in [2, 3, 4]:
    # 调用K_means,执行方法fitting()
    k_means = K_means(i, dataSet[['density', 'sugar_rate']].values.tolist(), 1000, 0.0000001)
    k_means.fitting()


相关