趁着准备即将到来的笔试,也为了回顾一下这一星期来所学的三个机器学习算法,觉得还是重新理一下思路,好理解一下这几个算法。
复制代码

kNN算法

即k-近邻算法,属监督学习。

概述

  • 优点:精度高,对异常值不敏感,无数据输入假定(其实还是没有很理解优点体现在什么方面
  • 缺点:复杂度高(时间复杂度、空间复杂度)
  • 适用数据范围:数值型和标称型
  • 原理:
    • 对给定的数据集,提取出特征值和标签分别存放
    • 输入新数据
    • 计算与给定数据集的距离
    • 排序
    • 选取距离最近(即最相似)的前k个数据的标签
    • 统计所有出现的标签被提取次数
    • 选取提取次数最多的标签分类作为新数据的分类

详细步骤

导入数据

即处理输出格式


import numpy as npdef getDataSet(filename):dataSet = np.loadtxt(filename,delimiter=',',usecols=(0,1,2,3))#获取特征值#delimiter为分割符,需要查看所有获取的数据集里面的内容#usecols为指定获取的列#np.loadtxt()得到的矩阵为float类型#以下获取数据集中的分类标签arrayLines = open(filename).readlines()#打开文件并获取所有行labelsVector = [] #空列表用以存储标签for line in arrayLines:line = line.strip().split(',')  #strip用以消除回车,split(',')用以分割行labelsVector.append(line[-1])   #标签存在于最后一列,改语句将最后一列输入到列表return dataSet,labelsVector
复制代码
分类器(kNN主算法)

#辅助函数:欧式距离
def distEuro(vecA,vecB):return np.power(np.sum(np.power(vecA-vecB),2),0.5)#kNN主算法函数
def classify(inX,labels,dataSet,k):#参数分别为:#inX:输入向量#labels:标签向量:所有数据的分类#dataSet:数据集#k:指定获取距离最近的数据的标签的数量m = dataSet.shape[0] #获取数据集的行数diffMat = distEuro(np.tile(inX,(m,1)),dataSet) #距离矩阵#排序并获得索引sortedDist = diffMat.argsort()  #得到diffMat中从小到大排好序的索引值labelCount = {} # 以键值对形式存储所提取标签及其出现次数for i in range(k):label = labels[sortedDist[i]]  #提取标签labelCount[label] = labelCount.get(label,0) + 1#也可:labelCount[label] = labelCount.setdefault(label,0) + 1#表示标签已存在是加一,不存在时将标签存入字典设置初始值为0再加一sortedCount = sorted(labelCount.item(),key=operator.itemgetter(1),reverse=True)#reverse=True表示降序排序#key=operator.itemgetter(0)表示按键排序#key=operator.itemgetter(1)表示按值排序return sotedCount[0][0] #返回标签复制代码
归一化

数据差值大的数据严重影响计算结果,将数值归一化(即取值范围在0-1之间),可以有效减小影响


def autoNorm(dataSet):dmin = dataSet.min(0)dmax = dataSet.max(0)ranges = dmax-dminm = dataSet.shape[0] #获取行数minMat = np.tile(dmin,(m,1))  #将dmin扩充为于数据集相同行数的矩阵rangeMat = np.tile(ranges,(m,1)) #将取值向量扩充为与数据集相同行数的矩阵normSet = (dataSet-minMat)/ranges #减去最小值,除以取值范围可得到归一化数组return normSet,ranges,dmin #返回归一化矩阵,范围,最小值
复制代码

测试和预测函数先略过。注意点位,对于处理过的数据集,采用随机分配测试集和训练集,对于未处理可以采用前百分之十作为测试集

kMeans

无监督学习,将相似的对象归到一个簇中

概述

  • 优点
  • 缺点
  • 适用数据范围
  • 原理:
    • 随机选取k个簇质心
    • 当标签变量为真(改变簇分配):
      • 遍历所有点

        • 遍历所有簇 -计算与簇质心的距离 将点分配到距离最近的簇质心

详细步骤

获取数据集(iris.data为例)

def getDataSet(filename):dataSet = np.loadtxt(filename,delimiter=',',usecols=(0,1,2,3))return dataSet
复制代码
获取簇质心

def randCent(dataSet,k):m = np.shape(dataSet)[1] #获取列数centroid = np.zeros((k,m)) #生成0矩阵用以存放簇质心for i in range(m):  #按列生成dmin = np.min(dataSet[:,i])dmax = np.max(dataSet[:,i])centroid[:,i] = dmin + np.random.random(k)*(dmax-dmin)return cendroid
复制代码
kMeans主算法

def kMeans(dataSet,k):m = np.shape(dataSet)[0]  #获取行数centroid = randCent(dataSet,k)  #获取簇质心cluster = np.zeros((m,2))  #存放簇质心索引和平凡误差label = Truewhile label:label = Falsefor i in range(m):dmin = np.inf #初始距离无穷大index = -1for j in range(k):distance = dist(dataSet[i,:],centroid[j,:]) #调用辅助函数计算距离if distance < dmin:dmin = distanceindex = jif index != cluster[i,0]:  #判断是否改变簇质心label = Truecluster[i,:] = index,dminfor i in range(k): #更新簇质心pst = dataSet[np.nonzero(cluster[:,0]==i)[0]]centroid[i,:] = np.mean(pts,axis=0)return centroid,cluster复制代码

二分kMeans

概述

  • 改进kMeans可能收敛到局部最小值的缺点,二分kMeans收敛到全局最小值
  • 原理:
    • 将所有点视为一个簇
    • 当簇个数小于k:
      • 遍历所有簇

        • 计算划分后降低的SSE
      • 划分SSE降低幅度最大的簇

二分kMeans主函数


def dichKmeans(dataSet,k,dist):m = np.shape(dataSet)[0]cluster = np.zeros((m,2))centroid = np.mean(dataSet,axis=0).tolist()[0]centList = [centroid]for i in range(m):cluster[i,1] = dist(np.array(centroid),dataSet[i,:])while (len(centList) < k):lowestSSE = np.inf #初始SSE设置为无穷大for i in range(len(centList)): #遍历每一个簇计算划分后的SSEcurSet = dataSet(np.nonzero(cluster[:,0]==i)[0],:) #获取当前簇索引的所有数据curCent,curCluster = kMeans(curSet,2) #将当前簇一分为二curSSE = np.sum(curCluster[:,1]) #新划分出来的两个簇的SSESSE = np.sum(cluster[np.nonzero(cluster[:,i] != i),1]) + curSSE #计算总SSEif SSE < lowestSSE:bestIndex = ibestCent = curCentbestCluster = curCluster.copy()lowestSSE = curSSE#数组过滤器,修改簇编号bestCluster[np.nonzero(bestCluster[:,0]==1)[0],0] = len(centList)bestCluster[np.nonzero(bestCluster[:,0]==0)[0],0] = bestIndexcentList[bestIndex] = bestCent[0,:]centLIst.append(bestCent[1,:])#更新簇特征值cluster[np.nonzero(cluster[:,0) == bestIndex)[0],:] = bestClusterreturn np.array(centList),cluster
复制代码

apriori算法

概述

  • 优点:易编码实现
  • 缺点:在大数据集上可能较慢
  • 适用数据类型:数值型或者标称型数据
  • 相关概念
    • 支持度
    • 可信度
    • 频繁项集
    • 关联规则
  • 原理:
    • 某个项集频繁->子集频繁
    • 某个项集非频繁->超集非频繁
  • 步骤
  1. 生成频繁项集

    • 生成元素为包含一个元素的列表的列表,作为待选集
    • 计算支持度,筛选出频繁集
    • 生成元素为包含两个元素的列表的列表,作为待选集
    • 计算支持度,筛选出频繁集
    • 重复直至包含x和元素的待选集为空
  2. 挖掘关联规则
    • 遍历包含一个元素的列表,到包含x-1个元素的列表

      • 遍历当前列表的每一个频繁集

        • 将频繁集化为包含只包含一个元素的集合的列表
        • 当前频繁集内元素大于1时:
          • 划分频繁集
        • 计算置信度,将满足最小置信度的规则存入列表

转载于:https://juejin.im/post/5cbdd66ee51d456e303db8a2

关于kNN、kMeans、Apriori算法小结相关推荐

  1. 【数据挖掘】数据挖掘算法 组件化思想 示例分析 ( 组件化思想 | Apriori 算法 | K-means 算法 | ID3 算法 )

    文章目录 一. 数据挖掘算法组件化思想 二. Apriori 算法 ( 关联分析算法 ) 三. K-means 算法 ( 聚类分析算法 ) 四. ID3 算法 ( 决策树算法 ) 一. 数据挖掘算法组 ...

  2. k-means聚类算法从入门到精通

    k-means算法是非监督聚类最常用的一种方法,因其算法简单和很好的适用于大样本数据,广泛应用于不同领域,本文详细总结了k-means聚类算法原理 . 目录 1. k-means聚类算法原理 2. k ...

  3. 数据挖掘十大经典算法之——Apriori 算法

    数据挖掘十大经典算法系列,点击链接直接跳转: 数据挖掘简介及十大经典算法(大纲索引) 1. 数据挖掘十大经典算法之--C4.5 算法 2. 数据挖掘十大经典算法之--K-Means 算法 3. 数据挖 ...

  4. 一步步教你轻松学K-means聚类算法

    一步步教你轻松学K-means聚类算法 (白宁超   2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类 ...

  5. 一步步教你轻松学关联规则Apriori算法

    一步步教你轻松学关联规则Apriori算法 (白宁超 2018年10月22日09:51:05) 摘要:先验算法(Apriori Algorithm)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...

  6. 一文搞懂K-means聚类算法

    一步步教你轻松学K-means聚类算法 阅读目录 目录 聚类 K-means(k均值)聚类算法 案例描述 从文件加载数据集 计算两个向量的欧氏距离 构建一个包含 K 个随机质心的集合 K-Means ...

  7. 《机器学习实战》之十一——使用Apriori算法进行关联分析

    Apriori算法目录 一.前言 二.关联分析 三.Apriori原理 四.利用Apriori算法来发现频繁集 1.Apriori算法及实例描述 2.生成候选项集 2.组织完整的Apriori算法 五 ...

  8. 数据挖掘十大经典算法之apriori算法源代码

    数据挖掘十大经典算法 国际权威的学术组织the IEEE International Conference on Data Mining (ICDM) 2006年12月评选出了数据挖掘领域的十大经典算 ...

  9. 数据挖掘中分类算法小结

    数据挖掘中分类算法小结   数据仓库,数据库或者其它信息库中隐藏着许多可以为商业.科研等活动的决策提供所需要的知识.分类与预测是两种数据分析形式,它们可以用来抽取能够描述重要数据集合或预测未来数据趋势 ...

最新文章

  1. SparkStreaming官方示例程序运行方式
  2. 高德地图自定义点标记大小_Vue:如何在地图上添加自定义覆盖物(点)
  3. 在Editplus中搭建Ruby开发环境
  4. 文件解析漏洞总结-Apache
  5. 让Dapper在一个项目中支持多种库
  6. Linux_linux常用工具---闲杂篇(除了vim, 还有哪些常用的牛逼的编辑器, 并能够横向对比编辑器之间的区别和优缺点.)
  7. 用注水实验法验证勾股定理
  8. iso8601 转换 java_java积累----ISO8601格式时间转化为Datetime类型
  9. error C3859: 超过了 PCH 的虚拟内存范围;请使用“-Zm276”或更大的命令行选项重新编译...
  10. Android studio 报错 Unknown host 'jcenter.bintray.com'
  11. UFS发生命令超时处理流程
  12. Android GPU呈现模式分析功能,手机流畅度。仅供参考
  13. 在线课程推荐(国外篇)
  14. 《大话处理器》简要学习笔记
  15. 艾永亮:耐克阿迪都慌了,成功逆袭的李宁,产品创新战略是什么
  16. 520表白攻略 程序员必要的相亲准备 最近你相亲表白了嘛
  17. Apple 在中国的维修和保修政策
  18. Hibernate Transformers之三种结果转换说明
  19. 沉痛哀悼,网页变黑白代码!
  20. 【论文泛读123】跨语言情感检测

热门文章

  1. 聊聊spring cloud gateway的PreserveHostHeaderGatewayFilter
  2. [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt
  3. 【视频点播最佳实践】视频点播播放异常排查
  4. swoole实现数据库连接池
  5. ios开发日记- 5 屏幕截图
  6. 查看sqlserver被锁的表以及如何解锁
  7. 怎么使用CAD编辑器来打开图纸中的所有图层
  8. 【重磅上线】思维导图工具XMind:ZEN基础问题详解合集
  9. Java泛型进阶 - 如何取出泛型类型参数
  10. ubuntu14.04 升级gcc的方法