# -*- coding: utf-8 -*-
"""
Created on Mon Aug 08 21:58:22 2016
@author: Administrator
"""
from numpy import *
import xlrd
import operator
from os import listdir
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
data = xlrd.open_workbook('data1.xlsx')
table = data.sheets()[0]
nrows = table.nrows #行数
ncols = table.ncols #列数
c1=arange(0,nrows,1)
datamatrix=zeros((nrows,ncols))
for x in range(ncols):
cols =table.col_values(x)
minVals=min(cols)
maxVals=max(cols)
cols1=matrix(cols)# 把list转换为矩阵进行矩阵操作
ranges=maxVals-minVals
b=cols1-minVals
normcols=b/ranges# 数据进行归一化处理
datamatrix[:,x]=normcols# 把数据进行存储
# 对得到的数据进行画图
fig=plt.figure()
#ax=fig.add_subplot(111)#参数111的意思是:将画布分割成1行1列,图像画在从左到右从上到下的第1块
plt.scatter(datamatrix[:,0],datamatrix[:,1])# 对于矩阵进行画图,注意与matlab里面的不同,它的第一列为[0]
ply.show()
inX=[1,10]
#k均值分类函数的定义
def classify0(inX,datamatrix,labels,k):
datamatrixSize = datamatrix.shape[0]# 得到矩阵的行与列数,[0]代表行数,[1]代表列数
diffMat=tile(inX,(datamatrixSize,1))-datamatrix
#tile(inX,(datamatrixSize,1))把inX扩展为5行一列的矩阵
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)#对每行元素进行求和
distances=sqDistances**0.5
sortedDistIndices=distances.argsort()#argsort函数返回的是数组值从小到大的索引值
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndices[0]]
k=classCount.get(voteIlabel,0)
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
#reverse=True 进行反向的排序
return sortedClassCount[0][0]
#定义的算法的调用
# 数据的初始化
inX=[1,10]# 预测的坐标
labels=['A','A','B','B','A']
k=2
h=classify0(inX,datamatrix,labels,k)
KNN学习笔记
最新推荐文章于 2021-09-23 20:19:45 发布