问题背景
? ? ? ? ? 我有时会搞混,所以写一篇博客来记录下自己的理解
KNN
- 分类算法
- 监督学习,数据集是带Label的数据
- 没有明显的训练过程,就是费事儿,每次都要遍历所有已有的样本点去计算距离
- K值含义 :对于一个样本X,要给它分类,首先从数据集中,在X附近找离它最近的K个数据点,将X划分为K个数据点中类别最多的一类
K-means
- 聚类算法
- 非监督学习,数据集是无Label,杂乱无章的数据
- 有明显的训练过程
- K值含义:K是事先设定的数字,将数据集分为K个簇,需要依靠人的先验知识
不同点
? ? ? ? ? 两种算法之间的根本区别是,K-means本质上是无监督学习,而KNN是监督学习;K-means是聚类算法,KNN是分类(或回归)算法。
? ? ? ? ? K-means算法把一个数据集分割成簇,有K个簇中心,每个样本 X 属于和 X 距离 最近的簇中心,每次迭代后更新这个簇中心的值,直到簇中心不再变化,请注意,这儿的簇中心不是实际存在的样本点,而是一堆样本的各维度平均值构成的一个虚拟的点。
代码python
? ? ? ? ? K-means 的代码之前写过了,请参见 k均值算法 动图制作代码
? ? ? ? ? KNN的代码如下
import numpy as np
import xlrd
import collections
"""
函数说明:对数据进行归一化
Parameters:
dataSet - 特征矩阵
Returns:
normDataSet - 归一化后的特征矩阵
ranges - 数据范围
minVals - 数据最小值
"""
def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
row = dataSet.shape[0]
normDataSet = (dataSet - np.tile(minVals, (row, 1))) / np.tile(ranges, (row, 1))
return normDataSet, ranges, minVals
"""
函数说明:计算向量与向量(矩阵多个向量)的距离
Parameters:
new_data - 向量
base_data - 矩阵或者向量
Returns:
distances - 距离(单个值或者向量形式)
"""
def calculate_distances(new_data,base_data):
dataSize = base_data.shape[0]
diffMat = np.tile(new_data, (dataSize, 1)) - base_data
sqDiffMat = diffMat ** 2
distances = (sqDiffMat.sum(axis=1)) ** 0.5
return distances
"""
函数说明:kNN算法,分类器
Parameters:
inX - 用于分类的数据(测试集)
dataSet - 用于训练的数据(训练集)
labes - 分类标签
k - kNN算法参数,选择距离最小的k个点
Returns:
sortedClassCount[0][0] - 分类结果
"""
def classify0(inX, dataSet, labels, k):
distances = calculate_distances(inX,dataSet)
k_labels = [labels[index][0] for index in distances.argsort()[0: k]]
label = collections.Counter(k_labels).most_common(1)[0][0]
return label
"""
函数说明:读取数据函数,算是算法之外的部分
Parameters:
path - 数据所在目录(在当前目录下,可直接使用文件名,不然则应该为绝对路径)
Returns:
datamatrix - 数据形式的数据
"""
def excel2matrix(path):
data = xlrd.open_workbook(path)
table = data.sheets()[0]
nrows = table.nrows
ncols = table.ncols
datamatrix = np.zeros((nrows, ncols))
for i in range(ncols):
cols = table.col_values(i)
datamatrix[:, i] = cols
return datamatrix
if __name__ == "__main__":
data = excel2matrix("data.xls")
lables = excel2matrix("labels.xls").astype(int)
nom_data, ranges, minVals = autoNorm(data)
class_number = 3
test = np.array([0.1,0.4,0.3]).reshape(1, -1)
test_class = classify0(test, nom_data, lables, class_number)
? ? ? ? ? KNN的的数据集在这儿
链接:https://pan.baidu.com/s/1Zqz_ZBPRi5PqcRPYQAEpPQ 提取码:ray8
|