k-NN——算法实现
k-NN 没有特别的训练过程,给定训练集,标签,k,计算待预测特征到训练集的所有距离,选取前k个距离最小的训练集,k个中标签最多的为预测标签
约会类型分类、手写数字识别分类
- 计算输入数据到每一个训练数据的距离
- 选择前k个,判断其中类别最多的类作为预测类
import numpy as np
import operator
import matplotlib
import matplotlib.pyplot as plt
# inX: test data, N features (1xN)
# dataSet: M samples, N features (MxN)
# label: for M samples (1xM)
# k: k-Nearest Neighbor
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
distances = np.sum(diffMat**2, axis=1)**0.5
sortDistances = distances.argsort() # 计算距离
classCount = {}
for i in range(k):
voteLable = labels[sortDistances[i]]
classCount[voteLable] = classCount.get(voteLable, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) # 找出最多投票的类
result = sortedClassCount[0][0]
# print("Predict: ", result)
return result
# 将一个文件写入矩阵,文件有4列,最后一列为labels,以\t间隔
def file2matrix(filename):
with open(filename) as f:
arrayLines = f.readlines()
# print(arrayLines) # 有\n
numberOfLines = len(arrayLines) # 将txt文件按行读入为一个list,一行为一个元素
returnMat = np.zeros((numberOfLines, 3))
classLabelVector = []
index = 0
for line in arrayLines:
line = line.strip()
listFromLine = line.split('\t')
returnMat[index,:] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1
return returnMat, classLabelVector
# 画一些图
def ex3():
datingDateMat, datingLables = file2matrix("datingTestSet2.txt")
fig = plt.figure()
ax = fig.add_subplot(1,2,1)
ax.scatter(datingDateMat[:,1], datingDateMat[:,2], s=15.0*np.array(datingLables), c=15.0*np.array(datingLables))
ax2 = fig.add_subplot(1,2,2)
ax2.scatter(datingDateMat[:,0], datingDateMat[:,1], s=15.0*np.array(datingLables), c=15.0*np.array(datingLables))
plt.show()
# 将数据集归一化[0 1]之间 (value - min)/(max - min)
def autoNorm(dataSet):
minVals = dataSet.min(axis=0)
maxVals = dataSet.max(axis=0)
ranges = maxVals - minVals
m = dataSet.shape[0]
normDataSet = dataSet - np.tile(minVals, (m,1))
normDataSet = normDataSet/np.tile(ranges, (m,1))
return normDataSet, ranges, minVals
# 分类器,输入数据集,归一化参数,labels,70%作为训练集,30%测试集
def datingClassTest(normDataSet, ranges, minVals, labels):
m = normDataSet.shape[0]
numOfTrain = int(m*0.7)
trainIndex = np.arange(m)
np.random.shuffle(trainIndex)
dataSet = normDataSet[trainIndex[0:numOfTrain],:]
testSet = normDataSet[trainIndex[numOfTrain:],:]
labels = np.array(labels)
dataSetLabels = labels[trainIndex[0:numOfTrain]]
testSetLabels = labels[trainIndex[numOfTrain:]]
k = int(input("Input k: "))
results = []
for inX in testSet:
result = classify0(inX, dataSet, dataSetLabels, k)
results.append(result)
compResultsAndLable = np.argwhere(results==testSetLabels)
acc = len(compResultsAndLable)/len(testSetLabels)
print("Accuracy: {:.2f}".format(acc))
print("Error: {:.2f}".format(1-acc))
classList = ['not at all', 'in small doses', 'in large doses']
inX1 = float(input("1: percentage of time spent playing video games? "))
inX2 = float(input("2: frequent flier miles earned per year? "))
inX3 = float(input("3: liters of ice cream consumed per year? "))
inXUser = [inX1,inX2,inX3]
inXUser = (inXUser - minVals)/ranges
result = classify0(inXUser, dataSet, dataSetLabels, k)
print("Predict: ", classList[result])
if __name__ == '__main__':
# # -- ex1 --
# inX = [1, 1]
# dataSet = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
# labels = ['A', 'A', 'B', 'B']
# k = 3
# classify0(inX, dataSet, labels, k)
# # -- ex2 --
datingDateMat, datingLables = file2matrix("datingTestSet2.txt")
# # -- ex3 --
# ex3()
# #-- ex4 --
# normDataSet, ranges, minVals = autoNorm(datingDateMat)
# # -- ex5 --
# datingClassTest(normDataSet, ranges, minVals, datingLables)
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import os
import operator
def img2vector(filename):
with open(filename) as f:
lines = f.readlines()
return_vector = []
for line in lines:
line = line.strip()
for j in line:
return_vector.append(int(j))
return return_vector
# inX: test data, N features (1xN)
# dataSet: M samples, N features (MxN)
# label: for M samples (1xM)
# k: k-Nearest Neighbor
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
distances = np.sum(diffMat**2, axis=1)**0.5
sortDistances = distances.argsort() # 计算距离
classCount = {}
for i in range(k):
voteLable = labels[sortDistances[i]]
classCount[voteLable] = classCount.get(voteLable, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) # 找出最多投票的类
result = sortedClassCount[0][0]
# print("Predict: ", result)
return result
def handwriting_class_test(data_set, training_labels, test_set, test_labels, k):
results = []
for i in range(len(test_set)):
result = classify0(test_set[i], data_set, training_labels, k)
results.append(result)
# print('predict: ', result, 'answer: ', test_labels[i])
compare_results = np.argwhere(results==test_labels)
acc = len(compare_results)/len(test_labels)
print("Accuracy: {:.5f}".format(acc))
print("Error: {:.5f}".format(1-acc))
if __name__ == '__main__':
dir_path = r'H:\ML\MachineLearninginAction\02kNN\digits'
training_path = os.path.join(dir_path, r'trainingDigits')
test_path = os.path.join(dir_path, r'testDigits')
training_files_list = os.listdir(training_path)
test_files_list = os.listdir(test_path)
# 计算训练集矩阵与labels
m = len(training_files_list)
# m = 5
data_set = np.zeros((m, 1024))
training_labels = np.zeros(m)
for i in range(m):
data_set[i] = img2vector(os.path.join(training_path, training_files_list[i]))
training_labels[i] = training_files_list[i].split('_')[0]
# 测试集矩阵与labels
mt = len(test_files_list)
test_set = np.zeros((mt,1024))
test_labels = np.zeros(mt)
for i in range(mt):
test_set[i] = img2vector(os.path.join(test_path, test_files_list[i]))
test_labels[i] = test_files_list[i].split('_')[0]
k = 3
handwriting_class_test(data_set, training_labels, test_set, test_labels, k)
k-NN——算法实现的更多相关文章
- kaggle赛题Digit Recognizer:利用TensorFlow搭建神经网络(附上K邻近算法模型预测)
一.前言 kaggle上有传统的手写数字识别mnist的赛题,通过分类算法,将图片数据进行识别.mnist数据集里面,包含了42000张手写数字0到9的图片,每张图片为28*28=784的像素,所以整 ...
- 机器学习实战笔记--k近邻算法
#encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...
- 《机器学习实战》学习笔记一K邻近算法
一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将 ...
- [Machine-Learning] K临近算法-简单例子
k-临近算法 算法步骤 k 临近算法的伪代码,对位置类别属性的数据集中的每个点依次执行以下操作: 计算已知类别数据集中的每个点与当前点之间的距离: 按照距离递增次序排序: 选取与当前点距离最小的k个点 ...
- k近邻算法的Java实现
k近邻算法是机器学习算法中最简单的算法之一,工作原理是:存在一个样本数据集合,即训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据和所属分类的对应关系.输入没有标签的新数据之后, ...
- 基本分类方法——KNN(K近邻)算法
在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...
- 聚类算法:K-means 算法(k均值算法)
k-means算法: 第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设 ...
- 从K近邻算法谈到KD树、SIFT+BBF算法
转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...
- Python实现kNN(k邻近算法)
Python实现kNN(k邻近算法) 运行环境 Pyhton3 numpy科学计算模块 计算过程 st=>start: 开始 op1=>operation: 读入数据 op2=>op ...
- 机器学习之K近邻算法(KNN)
机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...
随机推荐
- 浅谈MySQL同步到ElasticSearch的几种方式及其优缺点
同步双写 优点:业务逻辑简单. 缺点: 硬编码,有需要写入mysql的地方都需要添加写入ES的代码: 业务强耦合: 存在双写失败丢数据风险: 性能较差:本来mysql的性能不是很高,再加一个ES,系统 ...
- K8S 权限控制访问之 rbac
RBAC API类型 RBAC API 所声明的四种顶级类型[Role.ClusterRole.RoleBinding 和 ClusterRoleBinding].用户可以像与其他 API 资源交互一 ...
- rsync.sh
#!/bin/bash file1=`du -sm /var/www/vhosts/|awk '{print $1}'` ps=`ps -C rsync --no-header|wc -l` if [ ...
- alpakka-kafka(9)-kafka在分布式运算中的应用
kafka具备的分布式.高吞吐.高可用特性,以及所提供的各种消息消费模式可以保证在一个多节点集群环境里消息被消费的安全性:即防止每条消息遗漏处理或重复消费.特别是exactly-once消费策略:可以 ...
- python习题_读写csv格式的文件
1.读写TXT文件 # *_* coding : UTF-8 *_* # 开发人员 : zfy # 开发时间 :2019/7/7 16:26 # 文件名 : lemon_10_file.PY # 开发 ...
- hive 常用日期格式转换
固定日期转换成时间戳select unix_timestamp('2016-08-16','yyyy-MM-dd') --1471276800select unix_timestamp('201608 ...
- springboot实战小项目-简要介绍、vue项目创建
因为菜,所以要好好学习! 一.项目介绍:这是一个后台管理系统,准备实现的功能: 1.登录.注册.个人信息查看.退出登录 2.根据关键字查询用户.新增用户.根据id或者其他字段排序.编辑用户信息.删除用 ...
- eclipse的web项目导入IDE报错
问题:eclipse的web项目导入IDE报错 第一个问题: 解决:点击enable即可 第二个问题: 解决: 解决方法: 切换文件的编码 : from UTF-8 to GBK to UTF-8 参 ...
- winSCP上传文件到服务器失败,提示permission denied,返回码3
1.查看sftp服务在你服务器的路径 cat /etc/ssh/sshd_config | grep sftp 2.在winSCP进行连接设置 设置好你的主机名.端口.用户名和密码,然后点击高级,点击 ...
- Shell中退出状态码exit
shell中运行的每个命令都使用退出状态码(exit status)来告诉shell它完成了处理.退出状态码是一个0~255之间的整数值,在命令结束时由命令传回shell. 1 .查看退出状态码 Li ...