一、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算法的更多相关文章

  1. KNN 与 K - Means 算法比较

    KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...

  2. Python实现kNN(k邻近算法)

    Python实现kNN(k邻近算法) 运行环境 Pyhton3 numpy科学计算模块 计算过程 st=>start: 开始 op1=>operation: 读入数据 op2=>op ...

  3. K-means算法

    K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?  ...

  4. 基本分类方法——KNN(K近邻)算法

    在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...

  5. 机器学习之K近邻算法(KNN)

    机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...

  6. k邻近算法(KNN)实例

    一 k近邻算法原理 k近邻算法是一种基本分类和回归方法. 原理:K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实 ...

  7. 机器学习——KNN算法(k近邻算法)

    一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...

  8. kNN算法:K最近邻(kNN,k-NearestNeighbor)分类算法

    一.KNN算法概述 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它 ...

  9. 【算法】K最近邻算法(K-NEAREST NEIGHBOURS,KNN)

    K最近邻算法(k-nearest neighbours,KNN) 算法 对一个元素进行分类 查看它k个最近的邻居 在这些邻居中,哪个种类多,这个元素有更大概率是这个种类 使用 使用KNN来做两项基本工 ...

  10. k近邻算法(KNN)

    k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. from sklearn.model_selection ...

随机推荐

  1. cogs 247. 售票系统 线段树

    247. 售票系统 ★★☆   输入文件:railway.in   输出文件:railway.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 某次列车途经C个城市,城市 ...

  2. 求树上任意一点所能到达的最远距离 - 树上dp

    A school bought the first computer some time ago(so this computer's id is 1). During the recent year ...

  3. cf - 01串的问题

    One beautiful July morning a terrible thing happened in Mainframe: a mean virus Megabyte somehow got ...

  4. 主席树 - 查询某区间第 K 大

    You are working for Macrohard company in data structures department. After failing your previous tas ...

  5. Java入门 - 语言基础 - 14.String类

    原文地址:http://www.work100.net/training/java-string.html 更多教程:光束云 - 免费课程 String类 序号 文内章节 视频 1 概述 2 创建字符 ...

  6. javaweb-codereview 学习记录-4

    反射java.lang.Runtime 之前在p牛的知识星球中也学过反射机制调用Runtime来执行命令时需要用getruntime来返回Runtime类的实例,因为Runtime类设计是单例模式,并 ...

  7. 简单理解设计模式——享元模式-线程池-任务(tesk)

    前面在写到多线程的文章的时候,一直想写一篇关于线程池等一系列的文章,做一下记录,本篇博客记录一下设计模式中享元模式的设计思想,以及使用享元模式的实现案例——线程池,以及线程池的简化版——任务(tesk ...

  8. php编译完php.ini加载问题-Loaded Configuration File (none)

    编译安装php7时指定了--with-config-file-path=/usr/local/php7/etc,修改了 php.ini 的配置后重启,但就是不生效. 出现Loaded Configur ...

  9. Java之函数式接口@FunctionalInterface详解(附源码)

    Java之函数式接口@FunctionalInterface详解 函数式接口的定义 在java8中,满足下面任意一个条件的接口都是函数式接口: 1.被@FunctionalInterface注释的接口 ...

  10. ios--->泛型

    泛型 开发中使用场景: 1.限制集合中的类型,只能检测方法的调用,因为声明的泛型只能存在方法中 2.当一个类在声明的时候,某个对象的属性不确定,只有创建对象的时候才能确定,就可以使用泛型. 使用泛型的 ...