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 ...
随机推荐
- 【UEFI】---关于BIOS,EIST和PState&CState和CPU主频变化得关系
Intel处理器都支持Turbo和EIST,且一般情况下,各家厂商在BIOS中都会设置EIST和PState的开关,那么这些开关与CPU的频率的关系是什么呢?今天对此做个总结: 按照国际惯例,本次梳理 ...
- nginx介绍与安装
1.nginx作用可以配置数十个场景 2.环境安装 环境确认 安装环境 yum -y install gcc gcc-c++ autoconf pcre-devel make automa ...
- 关于<Java 中 RMI、JNDI、LDAP、JRMP、JMX、JMS那些事儿(上)>看后的一些总结-1
原文地址:https://www.anquanke.com/post/id/194384#h3-3 1.java rmi 关于rmi客户端和服务端通信的过程,java的方法都实现在rmi服务端,客户端 ...
- .net core ef动态orderby
前言 最近在给大家写一套开源的.net core权限管理框架.现在已经写到前台UI + 后台动态查询的部分. 发现需要动态orderby但是网上没有现成的例子 二话不说上代码 建议namespace ...
- 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! Spring Cloud Eureka 基于Netflix Eureka做了二次封装(Spring Clo ...
- java中5种异步转同步方法
先来说一下对异步和同步的理解: 同步调用:调用方在调用过程中,持续等待返回结果. 异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数. 其实,两者的区别还是 ...
- Java基础系列1:Java基本类型与封装类型
Java基础系列1:Java基本类型与封装类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括两 ...
- JS-07-函数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Day3-Python3基础-函数
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 1.函数的定义 定义: 函数是指将一组语句的集 ...
- BeautifulSoup标签定位方法总结
首先说明一下两个基本函数 .find() 和 .findAll(). find()返回第一个符合要求的标签 findAll()返回一个由所有符合要求的标签组成的列表.除此之外基本相同. 0.直接定位 ...