KNN和K-Means算法
一、KNN算法
1、KNN算法介绍
https://wizardforcel.gitbooks.io/dm-algo-top10/content/knn.html
2、KNN算法例子
import numpy as np
import matplotlib.pyplot as plt
import operator def createDataSet():
'''创建数据'''
#创建一个二维数组(4, 2)
group = np.array([
[1.0,1.1],
[1.0,1.0],
[0,0],
[0,0.1]
])
#定义好对应的标签
labels = ['A','A','B','B']
return group,labels def classify(inX,dataset,labels,k):
'''分类'''
dataSetSize = dataset.shape[0] #获取0轴的值,第一个维度的值 4
diffMat = np.tile(inX,(dataSetSize,1))-dataset #广播,然后用新数组减去原先的数组
# print(diffMat)
sqDiffMat = diffMat**2 #取diffMat的平方值
sqDistance = sqDiffMat.sum(axis=1) #求和,把1轴中每个数组中的和 [0.61 0.5 0.5 0.41]
distance = sqDistance ** 0.5 #对sqDistance进行开方,即获取当前点和其它4个点的距离
sortedDistanceIndex = distance.argsort() #对索引排序,对数值从小到大排序 #存放最终的投票结果
classCount = {} #循环k值对应的次数
for i in range(k):
voteIlabel = labels[sortedDistanceIndex[i]] #根据k值的数量,选出上面排序后,前面的标签名称,即A或者B
classCount[voteIlabel] = classCount.get(voteIlabel,0)+1 #对相应的标签出现的数量计数
print(classCount)
#排序,将次数最多的排到第一的位置
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0] #返回最多值的名称 def show_data(group,labels):
'''画图'''
labels = np.array(labels)
index_a = np.where(labels == "A") #获取A的下标
index_b = np.where(labels == "B") #获取B的下标
#画图,A点为红色,B点为绿色
for i in labels:
if i == "A":
plt.scatter(group[index_a][:,:1],group[index_a][:,1:2],c='red')
elif i == "B":
plt.scatter(group[index_b][:,:1],group[index_b][:,1:2],c="green")
plt.show() #显示
if __name__ == '__main__':
#导入数据
dataSet,labels = createDataSet()
#新数据坐标
inX = [0.5,0.5]
#定义k值
k = 3
className = classify(inX,dataSet,labels,k) #获取新数据的类型,即标签A或B(前面定义的标签)
print("该数据属于{}类".format(className))
dataSet = np.vstack((dataSet,inX)) #把新数据坐标加入数据中
labels.append(className) #将新数据的标签加入labels中
show_data(dataSet,labels) #画图
二、K-Means算法
1、kmeans算法介绍
https://www.cnblogs.com/pinard/p/6164214.html
2、kmeans算法例子
import numpy as np
import matplotlib.pyplot as plt # 加载数据
def loadDataSet(fileName):
data = np.loadtxt(fileName,delimiter='\t') #按照符号\t分隔
print(data.shape) #(10, 2)
return data # 欧氏距离计算
def distEclud(x,y):
return np.sqrt(np.sum((x-y)**2)) # 计算欧氏距离 # 为给定数据集构建一个包含K个随机质心的集合
def randCent(dataSet,k):
m,n = dataSet.shape #m为数据的个数,n为数据长度
centroids = np.zeros((k,n)) #创建(k,n)的0数组,用于初始化质心
print(dataSet[5,:])
for i in range(k):
index = int(np.random.uniform(0,m)) #使用uniform均匀分布获取0-m的随机数值
centroids[i,:] = dataSet[index,:] #生成质心的坐标
return centroids #返回质心的列表坐标 # k均值聚类
def KMeans(dataSet,k): m = np.shape(dataSet)[0] #行的数目
# 第一列存样本属于哪一簇
# 第二列存样本的到簇的中心点的误差
clusterAssment = np.mat(np.zeros((m,2))) #创建(m, 2)的0数组
clusterChange = True # 第1步 初始化centroids
centroids = randCent(dataSet,k) while clusterChange:
clusterChange = False # 遍历所有的样本(行数)
for i in range(m):
minDist = 100000.0
minIndex = -1 # 遍历所有的质心
#第2步 找出最近的质心
for j in range(k):
# 计算该样本到质心的欧式距离
distance = distEclud(centroids[j,:],dataSet[i,:])
if distance < minDist:
minDist = distance
minIndex = j
# 第 3 步:更新每一行样本所属的簇
if clusterAssment[i,0] != minIndex:
clusterChange = True
clusterAssment[i,:] = minIndex,minDist**2 #第 4 步:更新质心
for j in range(k):
pointsInCluster = dataSet[np.nonzero(clusterAssment[:,0] == j)[0]] # 获取簇类所有的点
centroids[j,:] = np.mean(pointsInCluster,axis=0) # 对矩阵的行求均值 print('===========',centroids)
print("Congratulations,cluster complete!")
print(clusterAssment)
return centroids,clusterAssment #返回centroids质心坐标,质心对应的聚类结果 def showCluster(dataSet,k,centroids,clusterAssment):
'''画图显示''' m,n = dataSet.shape
if n != 2:
print("数据不是二维的")
return 1 #定义点的颜色和风格
mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']
if k > len(mark):
print("k值太大了")
return 1 # 绘制所有的样本
for i in range(m):
markIndex = int(clusterAssment[i,0])
plt.plot(dataSet[i,0],dataSet[i,1],mark[markIndex]) #定义质心的颜色和风格
mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']
# 绘制质心
for i in range(k):
plt.plot(centroids[i,0],centroids[i,1],mark[i]) plt.show()
#导入数据
'''
1.65 4.28
-3.45 3.42
4.84 -1.15
-5.37 -3.36
0.97 2.92
-3.57 1.53
0.45 -3.30
-3.49 -1.72
2.67 1.59
-3.16 3.19
''' if __name__ == '__main__':
dataSet = loadDataSet("test.txt")
print(dataSet)
#定义质心数
k = 4
centroids,clusterAssment = KMeans(dataSet,k)
showCluster(dataSet,k,centroids,clusterAssment)
KNN和K-Means算法的更多相关文章
- KNN 与 K - Means 算法比较
KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...
- Python实现kNN(k邻近算法)
Python实现kNN(k邻近算法) 运行环境 Pyhton3 numpy科学计算模块 计算过程 st=>start: 开始 op1=>operation: 读入数据 op2=>op ...
- K-means算法
K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢? ...
- 基本分类方法——KNN(K近邻)算法
在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...
- 机器学习之K近邻算法(KNN)
机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...
- k邻近算法(KNN)实例
一 k近邻算法原理 k近邻算法是一种基本分类和回归方法. 原理:K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实 ...
- 机器学习——KNN算法(k近邻算法)
一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...
- kNN算法:K最近邻(kNN,k-NearestNeighbor)分类算法
一.KNN算法概述 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它 ...
- 【算法】K最近邻算法(K-NEAREST NEIGHBOURS,KNN)
K最近邻算法(k-nearest neighbours,KNN) 算法 对一个元素进行分类 查看它k个最近的邻居 在这些邻居中,哪个种类多,这个元素有更大概率是这个种类 使用 使用KNN来做两项基本工 ...
- k近邻算法(KNN)
k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. from sklearn.model_selection ...
随机推荐
- Spring Boot2 系列教程 (十四) | 统一异常处理
如题,今天介绍 SpringBoot 是如何统一处理全局异常的.SpringBoot 中的全局异常处理主要起作用的两个注解是 @ControllerAdvice 和 @ExceptionHandler ...
- 《深入浅出话数据结构》系列之什么是B树、B+树?为什么二叉查找树不行?
本文将为大家介绍B树和B+树,首先介绍了B树的应用场景,为什么需要B树:然后介绍了B树的查询和插入过程:最后谈了B+树针对B树的改进. 在谈B树之前,先说一下B树所针对的应用场景.那么B树是用来做什么 ...
- Qt Installer Framework翻译(3-3)
移除组件 下图说明了删除所有或某些已安装组件的默认工作流程: 本节使用在macOS上运行的Qt 5维护工具为例,来演示用户如何删除所有或部分选定组件. 移除所有组件 用户启动维护工具时,将打开&quo ...
- 解决jar包依赖冲突(idea)
在IDEA状态下查看项目依赖的关系 关系如下图 红色数据jar包冲突 在对应的依赖中出去去冲突依赖
- [bzoj2120] [洛谷P1903] 数颜色
Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜 ...
- 深入浅出MyBatis技术原理与实战
第1 章 MyBatis 简介..................................................................................... ...
- 清晰架构(Clean Architecture)的Go微服务: 编码风格
编码风格在编程中是一个相对乏味的主题,但是合适的编码风格对一个有效的程序员是至关重要的. 它有三个组成部分: 程序结构 ( application layout) 编码规则或风格 命名约定 我已经在清 ...
- sas9.2 windows7系统 10年11月后 建立永久数据集时,提示:“用户没有与逻辑库相应的授权级别
先把你这个逻辑库删掉,在桌面创立空的新文件夹,然后用这个新文件夹在sas里新建逻辑库,名字照旧,再把你要的数据放进空文件夹就好了
- 当vps服务器被墙,如果用xshell连接
当然你的被墙了,肯定是访问不了,你得去找一个新的可用的节点去访问,在xshell里面设置代理就能连接上.上图. 然后是两个不同的结点 鼠标放在小火箭上面就能显示
- 降级gcc版本
前言 ubuntu16.04版本中默认的gcc版本是5.4,因为有些第三方应用依赖的问题,我不得不降级到5.3,下面是关于gcc的降级操作 部署操作 下载GCC源码(https://ftp.gnu.o ...