一、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. UIChatBox模块示例demo

    感谢论坛版主 马浩川 的分享. UIChatBox 模块是一个聊天输入框模块,开发者可自定义该输入框的功能.通过 open 接口可在当前 window 底部打开一个输入框,该输入框的生命属于当前 wi ...

  2. Linux删除文件 清除缓存

    相信很多测试 经常会经历开发叫你清除缓存这种事. 那我们要怎么清呢? 一.首先,确认你要清除的缓存在哪个目录下,然后切换到该目录下,比如 我现在知道我的的缓存目录是在newerp这个目录下,则如图 二 ...

  3. MOS 常用链接地址

    主页面类  Exadata主页面 Exadata Database Machine and Exadata Storage Server Supported Versions (Doc ID 8888 ...

  4. Excel-条件格式

    今天运用了一下条件格式中的自建规则进行公式筛选, 设置格式那里一定要将$P$8修改为$P8 然后双击修改后的第一项进行单元格的自动填充

  5. MongoDB数据库备份和恢复

    1.数据库备份 mogodbdump -h dbhost -d dbname -o dbdirectory -h: 服务器地址,也可以指定端口号 -d: 需要备份的数据库的名称 -o: 备份的数据库存 ...

  6. 神器| 这款软件让win系统像Mac系统一样的好用!

    每天进步一丢丢,连接梦与想 输不起的人,往往就是赢不了的人 使用过 Mac OS X 系统的朋友可能都会使用过自带的 Quick Look 快速预览功能,用鼠标选中一个文件后,再按下键盘空格键就会弹出 ...

  7. 啥叫ORM

    名字: object / relation map 对象关系映射 定义: 通过(描述对象和数据库之间映射的)元数据把对象自动转为关系数据 一般都是作为中间件 优缺: 优点是自动化,屏蔽了SQL语句,而 ...

  8. 提高Dom 访问效率

    在浏览器中对于Dom的操作和普通的脚本的操作处于两个不同的dll中,两个dll的交互是比较耗时的,优化对Dom的操作可以提高脚本的执行速度. JS访问DOM是很慢的,尽量不要用JS来设置页面 布局 有 ...

  9. Frameworks.Entity.Core 7

    1描述:实体基类,与业务和架构无关名称:EntityBase属性:public abstract 2描述:/ MongoDB的一些扩展方法名称:MongoExtensions修饰: public st ...

  10. 20191217HNOI 模拟赛 复活石

    题目描述: 分析: 我也不知道我在干sm,但就是没写出来2333 枚举 i 的每个质因子 j ,复杂度为n^(3/2) 为什么我会认为是n^2啊2333 然后考虑 f ( j )对g ( i )做了多 ...