数据挖掘资料(问答)

第一章

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.将关联规则挖掘算法所采用的的策略。

点击查看答案

关联规则挖掘算法采用的策略为挖掘过程主要包含两个阶段,第一阶段必领先从事务数据集中找出所有的频繁项,第二阶段再由这些频繁项产生强关联规则。这些规则满足最小支持度和最小置信度闵值.

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

点击查看答案

6.第七章

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

K近邻算法的主要思想是当给定一个未知元组时,KNN 搜索模式空间,根据距离函数计算待分类样本x和每个训练样本的距离(作为相似度),选择与待分类样本距高最小的K 个样本作为x的K个最近邻,最后以x的K个最近邻中的大名数样本所属的类别作为x的类别。
K最近邻分类算法为:

step. L——初始化距商为最大值:
step. 2——计算未知样本和每个训练样本的距高 dist;
step. 3——得到目前K个最临近样本中的最大距高 maxdist:
step. 4——如果 dist 小于maxdist,则将该训练样本作为K-最近邻样本:
step.5——重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完:
step. 6——统计 K-最近邻样本中每个类标号出现的次数:
step. 7——选择出现频率最大的类标号作为未知样本的类标号。

算法伪代码为:

搜索k个近邻的算法:kNN(A[n], k)
输入:A[n]为N个训练样本在空间中的坐标(通过文件输入),k为近邻数
输出:x所属的类别
取A[1]-A[k]作为x的初始近邻,计算与测试样本x间的欧式距商d (x,A[i]),
i=1,2,...,k:按d(x,A[i])升序排序,计算最远样本与x间的距离
D<--max {d(x,a[j]) | j=1,2,...,k}
for (i=k+l:i<=n;i++)
计算 a[i]与x间的距离 d(x,A[i]):
if (d (x, A[i])) <D
then 用 A[i]代替最远样本
按照 d(x,A[i])升序排序,计算最远样本与x间的距高D<--max{d(x, A[j]) | j=1,, ,,i}:计算前k个样本A[i],i=1,2,...,k所属类别的概率,具有最大概率的类别即为样本x的类。

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

点击查看答案

优点:
1.有稳定分类效率;
2.对规模小的数据表现很好,能够处理多分类 任务,适合 增量式训练
3.对缺失数据比较敏感,算法比较简单
缺点:
1.该算法的假设条件在现实中一般不成立,在属性个数比较多或者属性之间相关系数比较大时,分类效果不好;
2.需要知道先验概率,且先验概率很多时候取决于假设导致预测效果不佳;
3.对输入数据的表达式很敏感。

7.第八章

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

点击查看代码

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()
posted @ 2021-12-04 17:17  卿源  阅读(696)  评论(0)    收藏  举报