人工智能学习日志

一、数据挖掘的概述
1.数据挖掘概念与发展
随着科学技术的飞速发展,使得各个领域或组织机构积累了大量数据。如何从这些数据中提取有用的信息和知识以帮助做出明智决策成为巨大的挑战。计算机技术的迅速发展使得处理并分析这些数据成为可能,这种技术就是数据挖掘( Data Mining , DM ),又称为数据库知识发现( Knowledge Discovery in Database , KDD )。

数据挖掘概念首次出现在1989年举行的第11届国际人工智能学术会议上,其思想主要来源于机器学习、模式识别、统计和数据库系统。目前对数据挖掘并没有统一的定义,大多采用的是韩家炜先生给出的定义:

数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的数据中提取隐含在其中的、人们事先不知道的,但又是潜在有用的信息和知识的过程。

上述定义的含义有以下几个方面:

第一,数据源必须是大量的、真实的,真实的数据往往含有噪声或缺失。

第二,发现的是用户感兴趣的知识。

第三,发现的知识要可接受,可理解,可运用,能支持特定的问题发现,能够支持决策,可以为企业带来效益,或者为科学研究寻找突破口。

2.数据挖掘的任务
数据挖掘的任务可以分为预测型任务和描述型任务,预测型任务就是根据其他属性的值预测特定属性的值,如回归、分类、离群点检测等。描述型任务就是寻找、概括数据中潜在联系的模式,如聚类分析、关联分析、演化分析、序列模式挖掘。

3.数据挖掘的应用
数据挖掘就是为大数据而生的,有大量数据的地方就有数据挖掘的用武之地。目前,应用较好的领域或行业有生物信息学、电信业、零售业以及保险、银行、证券等金融领域。

生物信息学是数据挖掘应用的新领域,是21世纪生物学的产物。零售业收集了关于销售、顾客购物史、消费等大量数据,是数据挖掘很好的应用领域之一。金融领域存有大量的客户信息记录、自身服务记录等,可用数据挖掘技术分析客户需求和兴趣,银行方面可以预测存、贷款趋势等,可以更好地服务客户。随着网络的发展,大量的文档数据涌现在网上,文本挖掘显得更加重要,这也是数据挖掘应用的一个重要子领域。

4.数据挖掘过程与方法
数据挖掘只是数据挖掘过程的一部分,完整的挖掘过程还包括以下步骤:定义业务目标、甄别数据源、收集数据、选择数据、数据质量检查、数据转换和结果解释。

在数据挖掘阶段,概括而言,数据挖掘分析员可以使用的数据挖掘的方法主要有以下几个:

(1)预估模型。(包括分类和预估两种类型)

(2)聚类技术

(3)连接技术

(4)时间序列技术

二、分类
分类的任务就是确定对象属于哪个预定义的目标类。分类问题是一个普遍存在的问题,有许多不同的应用。例如,根据电子邮件的标题和内容检查出垃圾邮件,对一大堆照片区分出哪些是猫,哪些是狗。分类任务就是通过学习得到一个目标函数,把每个属性集 x 映射到一个预先定义的类标号 y 。目标函数也称为分类模型。

分类模型可以作为解释性的工具,用以区分不同类中的对象。分类模型还可以预测未知记录的类标号,分类模型可以看做一个黑箱,当给定未知记录的属性集上的值时,它自动地赋予未知样本的类标号。

1.决策树分类法
我们知道决策树分类法是一种简单但广泛的分类技术。
从原则上讲,对于给定的数据集,可以构造的决策树的数目达到指数级。现在的许多算法都采用贪心算法,采取一系列局部最优决策来构造决策树,比如Hunt算法。
设D,是与结点t相关联的训练记录集,而y = { yiy2s...,yc为类标号,Hunt算法的递归定义如下:
(1)如果Dt中所有的记录都属于同一个类yt,则结点t是叶子结点,用yt标记;
(2)如果Dt中包含多个类的记录,则选择一个属性测试条件,将记录划分为较小的子集。对于测试条件的每个输出,创建一个子女结点,并根据测试结果将Dt中的记录分东到子女结点中,然后对每个子女结点递归地调用该算法;

2.基于规则的分类器
基于规则的分类器是使用一组" if .… then .…"规则来对记录进行分类的技术。为了建立基于规则的分类器,需要提取一组规则来识别数据集的属性和类标号之间的关键联系。提取分类规则的方法有两大类:直接方法和间接方法。直接方法是直接从数据中提取分类规则,间接方法是从其他分类模型中提取分类规则。

顺序覆盖算法经常被用来直接从数据中提取规则,规则对于某种评估度量以贪心的方式增长。该算法按照从包含多个类的数据集中一次提取一个类的规则,决定哪一个类的规则最先产生的标准取决于多种因素,如类的普遍性,或者给定类中误分类记录的代价。顺序学习规则:对每个给定的类 Cj ,希望规则可以覆盖该类的大多数元组,但不包括其他类的元组(或很少)。

(1)初始值为空规则集。

(2)使用 Learn - One = Rule 函数得到一条新规则。

(3)从训练集中删除被新产生的规则所覆盖的实例。

(4)重复步骤(2)和步骤(3),直到满足停止标准为止。

3.朴素贝叶斯分类器
朴素贝叶斯分类方法是基于统计的学习方法,利用概率统计进行学习分类,如预测一个数据属于某个类别的概念。主要算法有朴素贝叶斯分类算法、贝叶斯信念网络分类算法等。

贝叶斯分类方法的主要特点如下:

(1)利用先验知识显式计算假设概率。

(2)利用有向图表示,直观易于理解。

(3)能进行增量学习,方便处理不完整数据。

4.基于距离的分类算法
在实际的计算问题中往往用距离来表征相似性。距离越近,相似性越大;距离越远,相似性越小。为了计算相似性,应首先得到表示每个类的向量。最常用的是通过计算每个类的中心来完成。     给定一个数据库D ={t1,t2,... ,tn}和一组类C= {C1,C2,... ,Cm}。假定每个元组包括一些数值型的属性值:ti= {ti1,ti2,..., tik},每个类也包含数值性属性值:C= {C1,C2,... ,Cik},则分类问题是要分配每个t{到满足如下条件的类Cj:
sim(ti,C;) ≥ sim(ti,Cp)vcp∈ C,Cp≠ Cj在实际的计算问题中往往用距离来表征相似性。距离越近,相似性越大;距离越远,相似性越小。为了计算相似性,应首先得到表示每个类的向量。最常用的是通过计算每个类的中心来完成。

三、聚类
1.概念
聚类分析的核心是聚类,聚类是一种无监督学习,实现的是将整个数据集分成不同的“簇”,在相关的文献中,也将之称为“对象”或“数据点”。聚类要求簇与簇之间的区别尽可能大,而簇内数据的差异尽可能小。与分类不同,不需要先给出数据的类别属性。

2.聚类分析的基本方法
聚类分析的研究主要基于距离和基于相似度的方法。根据不同的数据类型和聚类的目的可以选择不同的聚类算法。

1)划分聚类的方法

给定一个数据集,将构建数据集的有限个划分,每个划分都是一个簇,且每一个划分应当满足如下两个条件:(1)每个划分中至少包含一个样本。(2)每个样本只能属于一个簇。

 k - Means 和 k - Medoids 就是典型的划分聚类算法。 k - Means 算法是一种最常用的基于划分的聚类方法。其基本思想是:把数据集划分成 k 个簇,每个簇内部的样本非常相似,但不同簇之间样本则又差异很大。在给定初始 k 个簇之后,算法根据某个距离函数反复地把数据分入 k 个聚类中,直到满足终止条件为止。(k - Means 并不适合所有的数据类型。)

2)层次聚类的方法

层次聚类技术是第二类重要的聚类方法。采用的是某种标准对给定的数据集进行层次的分解。结构实际上就是层次树。可以通过两种方法来构造层次树,即自底向上的方法和自顶向下的方法,它们分别又称为凝聚的方法和分裂的方法。

给定聚类簇 C 和 Cj ,可以通过以下公式计算它们的最小距离、最大距离和平均距离。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python实现神经网络学习的代码示例: 首先,我们需要导入必要的Python模块: ```python import numpy as np import matplotlib.pyplot as plt ``` 接下来,我们定义一个神经网络的类: ```python class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size # 初始化权重 self.weights_ih = np.random.randn(self.hidden_size, self.input_size) self.weights_ho = np.random.randn(self.output_size, self.hidden_size) # 初始化偏置 self.bias_h = np.zeros((self.hidden_size, 1)) self.bias_o = np.zeros((self.output_size, 1)) # 设置学习率 self.learning_rate = 0.1 ``` 在神经网络的初始化方法中,我们定义了神经网络的输入层大小、隐藏层大小和输出层大小,并初始化了权重和偏置。我们还设置了学习率。 接下来,我们定义神经网络的前向传播方法: ```python def forward(self, x): # 计算隐藏层的值 hidden = np.dot(self.weights_ih, x) + self.bias_h hidden = 1 / (1 + np.exp(-hidden)) # 计算输出层的值 output = np.dot(self.weights_ho, hidden) + self.bias_o output = 1 / (1 + np.exp(-output)) return output ``` 在前向传播方法中,我们首先计算隐藏层的值,然后使用Sigmoid函数进行激活。接着,我们计算输出层的值,并使用Sigmoid函数进行激活。最后,我们返回输出层的值。 接下来,我们定义神经网络的反向传播方法: ```python def backward(self, x, y, output): # 计算输出层的误差 error_output = output - y # 计算输出层的梯度 gradient_output = output * (1 - output) # 计算输出层的权重更新 delta_weights_ho = np.dot(error_output * gradient_output, self.hidden.T) # 计算输出层的偏置更新 delta_bias_o = np.sum(error_output * gradient_output, axis=1, keepdims=True) # 计算隐藏层的误差 error_hidden = np.dot(self.weights_ho.T, error_output) # 计算隐藏层的梯度 gradient_hidden = self.hidden * (1 - self.hidden) # 计算隐藏层的权重更新 delta_weights_ih = np.dot(error_hidden * gradient_hidden, x.T) # 计算隐藏层的偏置更新 delta_bias_h = np.sum(error_hidden * gradient_hidden, axis=1, keepdims=True) # 更新权重和偏置 self.weights_ho -= self.learning_rate * delta_weights_ho self.bias_o -= self.learning_rate * delta_bias_o self.weights_ih -= self.learning_rate * delta_weights_ih self.bias_h -= self.learning_rate * delta_bias_h ``` 在反向传播方法中,我们首先计算输出层的误差,然后计算输出层的梯度和权重更新。接着,我们计算隐藏层的误差,然后计算隐藏层的梯度和权重更新。最后,我们使用更新的权重和偏置来更新神经网络。 最后,我们定义一个训练方法来训练神经网络: ```python def train(self, x_train, y_train, epochs): for epoch in range(epochs): for i in range(len(x_train)): x = x_train[i].reshape(self.input_size, 1) y = y_train[i].reshape(self.output_size, 1) # 前向传播 self.hidden = np.dot(self.weights_ih, x) + self.bias_h self.hidden = 1 / (1 + np.exp(-self.hidden)) output = np.dot(self.weights_ho, self.hidden) + self.bias_o output = 1 / (1 + np.exp(-output)) # 反向传播 self.backward(x, y, output) # 计算损失 loss = self.loss(x_train, y_train) print('Epoch %d/%d - Loss: %f' % (epoch+1, epochs, loss)) ``` 在训练方法中,我们首先对每个训练样本进行前向传播和反向传播。然后,我们计算损失并输出日志。 最后,我们定义一个计算损失的方法: ```python def loss(self, x, y): loss = 0 for i in range(len(x)): x_i = x[i].reshape(self.input_size, 1) y_i = y[i].reshape(self.output_size, 1) output = self.forward(x_i) loss += np.sum(np.square(output - y_i)) return loss / len(x) ``` 在计算损失方法中,我们对每个训练样本计算预测值和真实值之间的平方误差,并将其加起来。最后,我们将总误差除以训练样本的数量来得到平均损失。 现在,我们可以使用上面定义的神经网络类来训练一个二分类模型。以下是一个示例: ```python # 定义训练集 x_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y_train = np.array([[0], [1], [1], [0]]) # 创建神经网络实例 nn = NeuralNetwork(input_size=2, hidden_size=4, output_size=1) # 训练神经网络 nn.train(x_train, y_train, epochs=1000) # 在测试集上进行预测 x_test = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y_test = np.array([[0], [1], [1], [0]]) for i in range(len(x_test)): x = x_test[i].reshape(2, 1) y = y_test[i].reshape(1, 1) output = nn.forward(x) print('Input: %s, Output: %s, Target: %s' % (x.T, output.T, y.T)) ``` 在这个示例中,我们使用XOR逻辑运算符的训练数据来训练一个二分类模型。我们使用一个包含4个隐藏单元的隐藏层,并在训练过程中进行了1000个迭代。最后,我们在测试集上进行了预测,并打印了每个样本的输入、输出和目标值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值