当前位置: 首页 > 编程日记 > 正文

关于kNN、kMeans、Apriori算法小结

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

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

相关文章:

[PHP] Phalcon操作示范

这篇内容将对下列操作进行示范&#xff1a; Insert、Select、Update、Calculation、Transaction、models advanced、dev-tools、cookies [ Insert ] &#xff08;1&#xff09; // 模型内操作&#xff0c;data是[字段>值]的一维数组。$bool $this->save($data);return $…

【C++】lambda 表达式

1.lambda 表达式 1.1 lambda 特点 lambda表示一个可调用单元&#xff0c;可视为内联函数 范式 : 具有一个返回类型&#xff0c;一个参数列表&#xff0c;一个函数体 [captrue list](parameters list)->return type {function body} captrue list 捕获列表是一个lambda所…

8位图像的双边滤波器实现

static void bilateralFilter_8u( const Mat& src, Mat& dst, int d,double sigma_color, double sigma_space,int borderType ) {// 获取原始图像信息int cn src.channels();int i, j, maxk, radius;Size size src.size();CV_Assert( (src.type() CV_8UC1 || src.t…

读取Cert格式证书的密钥

不想存储Cert证书内容&#xff0c;只想存储证书密钥&#xff0c;可通过以下2種方式实现 一、通過java读取证书的密钥出来&#xff1a; 1 package com.zat.ucop.service.util;2 3 import sun.misc.BASE64Encoder;4 5 import java.io.FileInputStream;6 import java.security.Pu…

图像导向滤波操作

#include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace std; using namespace cv; // 导向滤波器 cv::Mat guid…

【C++】bind参数绑定 P354(通用的函数适配器)

1. 什么时候该使用bing &#xff1f;什么时候该使用lambda&#xff1f; 当只有少数地方调用时候使用lambda,当需要多次调用lambda时&#xff0c;需要定义一个函数&#xff0c;而不是多次编译相同的lambda表达式。 调用bind的一般形式为&#xff1a; auto newCallable bind(cal…

[译] RabbitMQ tutorials (3) ---- 'Pub/Sub' (Javascript)

发布与订阅 &#xff08;Publish/Subscribe&#xff09; 在之前的章节中&#xff0c;我们创建了工作队列&#xff0c;之前的工作队列的假设是每个任务只被分发到一个worker。在这一节中&#xff0c;我们会做一些完全不一样的事--把一条消息发送给多个消费者&#xff0c;这个模式…

如何选取合适的前端动效方案?

一、原因 前端动画场景需求多对众多动画场景的技术实现方案选择上比较模糊 各动画方案的优劣及适用场景认识模糊现有动画库太多&#xff0c;不知道选哪个 主流动画库的适用场景认识模糊二、分类 动画用途 展示型的动画&#xff0c;类似于一张GIF图&#xff0c;或者一段视频交互…

【C++】algorithm具体操作记录

find寻找特定元素位置 int main(char argc, int* argv[]) {vector<int> intVec { 0,1,1,1,1,2,3,4,5,6,7,8,9 };if (pos ! intVec.end())cout << "The value 5 exists,and its position is " <<distance(intVec.begin(), pos) 1 << endl;…

图像 DFT 尺寸转换

const int nRows srcImage.rows; const int nCols srcImage.cols; std::cout << "srcImage row:" << nRows << std::endl; std::cout << "srcImage col:" << nCols << std::endl; // 获取DFT尺寸 int cRo…

[python]目录及文件操作

Python OS模块和shutil模块 获取路径# 获取当前路径 pwd os.getcwd()# 获取上级路径 a_pwd os.path.abspath(os.path.dirname(os.getcwd())) a_pwd os.path.abspath(os.path.join(os.getcwd(), ..))# 获取上上级路径 aa_pwd os.path.abspath(os.path.join(os.getcwd(), ../…

【C++】关联容器学习记录

STL六大组件关系 Containe通过Allocator取得数据存储空间&#xff0c;Algorithm通过Iterator存取Container&#xff0c;Functor内容可以协助Algorithm完成不同的策略变化&#xff0c;Adaptor可以修饰或者套接Functor。 关联容器特性 1. 关联容器定义 顺序容器支持高效的关键…

图像 DFT 变换

// 通道组建立&#xff0c;cv::Mat groupMats[] {cv::Mat_<float>(sizeConvMat),cv::Mat::zeros(sizeConvMat.size(), CV_32F)};cv::Mat mergeMat;// 通道合并merge(groupMats,2,mergeMat);// DFT变换dft(mergeMat, mergeMat);// 分离通道split(mergeMat, groupMats);/…

MySQL innodb_autoinc_lock_mode 详解

innodb_autoinc_lock_mode这个参数控制着在向有auto_increment 列的表插入数据时&#xff0c;相关锁的行为&#xff1b; 通过对它的设置可以达到性能与安全(主从的数据一致性)的平衡 【0】我们先对insert做一下分类 首先insert大致上可以分成三类&#xff1a;     1、simpl…

小程序代理加盟实现月入1800到50K

他出身寒门&#xff0c;没钱没资源&#xff0c;搬过砖利用身边的健身达人赚过钱&#xff0c;毕业了院长看他很努力还安排过维修多媒体的工作&#xff0c;拒绝院长好意的他&#xff0c;月收入从1800到1万&#xff0c;再到赚到人生首个5万。 只用了一年&#xff0c;他到底是凭什么…

CCF201503-4 网络延时(100分)

试题编号&#xff1a; 201503-4 试题名称&#xff1a; 网络延时 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述给定一个公司的网络&#xff0c;由n台交换机和m台终端电脑组成&#xff0c;交换机与交换机、交换机与电脑之间使用网络连…

【Smart_Point】动态内存与智能指针

动态内存 动态内存使用的三种原因 程序不知道自己需要多少对象程序不知道所需对象的准确类型程序需要在多个对线之间共享数据 文章目录动态内存动态内存使用的三种原因实例1&#xff1a; Exercise 12.2:Write your own version of the StrBlob class including the const ver…

JS中的null和undefined,undefined为啥用void 0代替?

起因 某天,在看某位同学的js代码,代码中发现了一个奇怪的东西 void 0,虽然第一眼看不懂这是什么东西,但是根据上下文,这里应该是想判断是否等于undefined,为什么要这样写的,有什么渊源吗?顺便就把undefined和null都拿出来复习了一下. 介绍 undefined和null是js中类型七种数据类…

【Smart_Point】动态内存与智能指针实战:文本查询程序(设计set,map,智能指针的应用)

文章目录Cpp读入结构性数组文本查询程序文本查询程序本版1Cpp读入结构性数组 #include<sstream> #include<iostream> #include<string>std::vector<cv::Point2f> point_calibartion_position;std::string filename "C:/Users/Administrator/Des…

我眼中的DevOps(转)

过去一年以来&#xff0c;一批来自欧美的、不墨守陈规的系统管理员和开发人员一直在谈论一个新概念&#xff1a;DevOps。DevOps 就是开发&#xff08;Development&#xff09;和运维&#xff08;Operations&#xff09;这两个领域的合并。&#xff08;如果没错的话&#xff0c;…

【阿圆实验】Consul HA 高可用方案

一、建立Consul Cluster环境 利用Consul提供的服务实现服务的注册与发现&#xff0c;需要建立Consul Cluster。在Consul方案中&#xff0c;每个提供服务的节点上都要部署和运行Consul的agent&#xff0c;所有运行Consul agent节点的集合构成Consul Cluster。Consul agent有两种…

【C++】拷贝,赋值与构造

拷贝&#xff0c;赋值与构造 文章目录拷贝&#xff0c;赋值与构造1. 拷贝构造函数/合成拷贝构造函数&#xff08;copy constructor&#xff09;2. 拷贝赋值运算符3. 析构函数1. 拷贝构造函数/合成拷贝构造函数&#xff08;copy constructor&#xff09; 1.1 定义&#xff1a;复…

Java 内存查看与分析

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff1a;gc日志输出 在jvm启动参数中加入 -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimestamps -XX:PrintGCApplicationStopedTime&#xff0c;jvm将会按照这些参数顺序输出gc概要信息&#xff0c;详细信息&…

玩转Vuejs--核心原理

一、摘要&#xff1a; Vuejs是一款前端MVVM框架&#xff0c;利用Vuejs、webpack以及周边一系列生态工具我们可以快速的构建起一个前端应用&#xff0c;网上对于Vue的分析大都是基于各个模块&#xff0c;理解起来不够顺畅&#xff0c;本文将从整个执行过程出发&#xff0c;讲一下…

【C++】拷贝控制与资源管理

1. 拷贝控制与资源管理 管理类外资源的类必须定义拷贝控制成员。如P447中所见&#xff0c;这种类需要通过析构函数来释放对象所分配的资源。一旦一个类需要析构函数&#xff0c;那么几乎可确定它也需要一个拷贝构造函数和一个拷贝赋值函数。 明确拷贝语义&#xff1a;可以定义…

leangoo V5.4.2版上线

本次更新增加了“卡片编辑面板内显示成员、截止日期、工作量”的功能。同时我们也进行了大量的功能优化&#xff0c;以下是此次更新详情&#xff1a; 1. 新增“卡片编辑面板内显示成员、截止日期、工作量”功能 本次更新后 &#xff0c;您在卡片编辑面板内添加成员&#xff0c;…

差分边缘检测实现

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> using namespace cv; // 图像差分操作 void diffOperation(const cv::Mat srcImage, cv::Mat& edgeXImage,cv::Mat& edgeYImage) {cv::Mat…

2.1:CGPROGRAM

文章著作权归作者所有。转载请联系作者&#xff0c;并在文中注明出处&#xff0c;给出原文链接。 本系列原更新于作者的github博客&#xff0c;这里给出链接。 前言 经过前面两个章节的铺垫&#xff0c;我们对渲染以及Unity Shaderlab相关的知识已经有了大概的认识&#xff0c;…

【OpenCV】OpenCV中积分图函数与应用

OpenCV中积分图函数与应用 参考资料 opencv 查找integral&#xff0c;目前网上大部分的资料来自于opencv https://docs.opencv.org/master/d7/d1b/group__imgproc__misc.html#gadeaf38d7701d7ad371278d663c50c77dhttps://blog.csdn.net/jia20003/article/details/52710751ht…

django学习笔记【003】创建第一个带有model的app

【1】python应用程序要连接mysql有多个驱动程序可供选择&#xff1a; 1、MySQLdb 这个只支持python2.x 所以在这里就不说了&#xff1b; 2、mysqlclient 下载地址   https://pypi.python.org/pypi/mysqlclient/1.3.9 3、MySQL Connector/python 这个是mysql官方主推的mysql驱…