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 ...
随机推荐
- SpringCloud组件和概念介绍(一)
一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及 ...
- 《C# 爬虫 破境之道》:第二境 爬虫应用 — 第二节:以事件驱动状态、数据处理
续上一节内容,对Web爬虫进行进一步封装,通过委托将爬虫自己的状态变化以及数据变化暴露给上层业务处理或应用程序. 为了方便以后的扩展,我先定义一个蚂蚁抽象类(Ant),并让WorkerAnt(工蚁)继 ...
- request session
例子 url = 'http://beanhome.com/user/login' header = { "Content-Type": 'application/json', & ...
- 外网主机远程ssh局域网Linux
最近,公司有台配置极高的主机盒子(i7,32G,512G),组长让我装上kali,平时渗透测试时可以用,其余时间归我了,这么高配置的机器,怎么舍得让它吃灰呢 .所以我就去研究了一下,如何远程访问局域网 ...
- 剑指Offer对答如流系列 - 重建二叉树
面试题6:重建二叉树 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8} ...
- Dynamics CRM 快速获取custom entity
我们可以使用Command来实现快速获取custom entity的值. 创建cmd 并且在nuget中引用 CRMSDK 复制下面的代码. userName 为登陆CRM的email passwo ...
- springboot中的那些连接池
hello~各位读者新年好! 回想起前几天在部署springboot项目到正线时,线上环境要求jdk7,可项目是基于jdk8开发的,springboot也是用的springboot2以上的版本,可以说 ...
- 快速构建第三方api应用
1.使用框架和扩展 详细请看composer.json "php": "^7.1.3", "laravel-admin-ext/config" ...
- JS-03-数据基本类型与转换
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- JQuery--使用JQuery 的$.ajax 方法进行异步请求,导致页面闪烁
情景 目前有个需求是在文本框填入内容,自动触发keyup事件,下拉列表会自动过滤相应的选项,但是使用了$,ajax后发现,每次触发事件时,都导致整个网页闪烁,触发了全局ajax事件 代码片段 $.aj ...