分类相似度:KNN算法笔记 K-近邻算法
其实说白了就是隔壁老王,因为近呀,近朱者赤近墨者黑,环境影响的,是骡子是马,拉出来遛遛。
一个简单的欧几里得距离或者直角三角形斜边距离,用代码实现就让人望其项背了,还弄几个矩阵/数组就彻底让老子跪地求饶了,没办法呀,死人控制着活人,这群数学家,物理学家们留给我们这么多好东西,他们一走了之,乘鹤而去,让我们这些后来者就只能半夜起来哭了,因为智商不够呀。
万物皆算法 只可惜我是图样图森破 too young too simple sometimes naive.说的就是奴家呀。
只能用路漫漫其修远兮,吾将上下而求索来安慰自己吧,昨天已经填了很多坑,明天乐观的坚信,还有更多坑等着我去填,
一不小心有可能把自己给填了。
'''
os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;sys模块负责程序与python解释器的交互,
提供了一系列的函数和变量,用于操控python的运行时环境。
常见分类算法:
1,KNN算法
2.贝克斯方法
3.决策树
4.人工神经网络
5.支持向量机(SVM)
KNN算法的实现步骤
KNN全称是k-Nearest Neighbors,意思是K个最近的邻居。视野的问题 环境的决定性 归类
1.处理数据
2.数据向量化
3.计算欧几里得距离
4.根据距离进行分类
'''
#shape在数组中的表示法 shape[0] 表示第一维度 即行 在矩阵中
>>> c = array([[1,1],[1,2],[1,3],[1,4]])
>>> c.shape
(4, 2)
>>> c.shape[0]
4
>>> c.shape[1]
2
#tile函数 同样是拓展多少倍 行数
>>> a=npy.array([[1,2,3,4],[3,4,5,6]])
>>> a
array([[1, 2, 3, 4],
[3, 4, 5, 6]])
>>> a.shape[1]
4
>>> a.shape[0]
2
>>> tile(a,(2,1))
array([[1, 2, 3, 4],
[3, 4, 5, 6],
[1, 2, 3, 4],
[3, 4, 5, 6]])
#使用.sum(axis=1)求和的公式用法
>>> a
array([[1, 2, 3, 4],
[3, 4, 5, 6]])
>>> a.sum(axis=1) #行中所有列求和
array([10, 18])
>>> a.sum(axis=0)
array([ 4, 6, 8, 10]) #列中所有行求和
#字典形式投票累计 .get方法
>>> a={}
>>> a[5]=a.get(4,0)+1
>>> a
{5: 1}
>>> a[5]=a.get(4,0)+1
>>> a
{5: 1}
>>> a[5]=a.get(5,0)+1
>>> a
{5: 2} #次数累计
#.argsort()函数来下标排序
>>> s
[[3, 6, 2, 9]]
>>> d=npy.array([1,6,3,8])
>>> d
array([1, 6, 3, 8])
>>> d.argsort()
array([0, 2, 1, 3], dtype=int64)
import operator
from numpy import *
def knn(k,testdata,traindata,labels):
traindatasize=traindata.shape[0]
dif=tile(testdata,(traindata,1))-traindata
sqdif=dif**2
sumsqdif=sqdif.sum((axis=1))
distance=sumsqdif**0.5
sortdistance=distance.argsort()
count{}
for i in range(0,k):
vote=labels[sortdistance[i]]
count[vote]=count.get(vote,0)+1
sortcount=sorted(count.items(),key=operator.itemgetter(1),reverse=True) #默认排序是升序 这里表述降序
return sortcount[0][0] #字典中第一个格式中的第一个key 即labels
#重复练习的 好记性不如烂笔头
from numpy import *
import operator
def knn(k,testdata,traindata,labels):
traindatasize=traindata.shape[0]
dif=tile(testsize,(traindatasize,1))-tanindata
sqdif=dif**2
sumsqdif=sqdif.sum(axis=1)
distance=sumdif**0.5
sortdistance=distance.argsort() #对向量从小到大排序 使用的是索引形式 即下标 得到一个向量
count={}
for i in range(0,k):
vote=labels[sortdistance[i]] #标签计数 按下标取标签对应
count[vote]=count.get(vote,0)+1 #进行累加 标签数目 字典中key形式
sortcount=sorted(count.items(),key=operator.itemgetter(1),reverse=True)
return sortcount[0][0]
#pip install pillow
#pillow 图片处理 将图片处理成文本 将图片转成固定宽高 然后转为文本
from PIL import Image
fh=open('E:/python/weixin.txt','a') #原文档中没有建立文件 所以以追加方式下入
img=Image.open('E:/python/weixin.png') #打开图片要用Image.open
img.save('E:/python/weixin.bmp')
width=img.size[0]
height=img.size[1]
for i in range(0,width):
for j in range(0,height):
color=img.getpixel((i,j)) #getpixel得到像素
colorall=color[0]+color[1]+color[2]
if (colorall==0): #可惜该方法只能处理黑白形式照片 因为RGB三原色==0
fh.write('1')
else:
fh.write('0')
fh.write('\n') #换行输出
fh.close()
from numpy import *
from os import listdir #获取文件夹下面所有的文件
#npy.zeros((3,4)) #生成三行四列的矩阵
#思路载入数据 建立训练数据并转化向量形式 测试数据并转化向量形式 KNN算法实现
#加载数据
def datatoarray(fname):
arr=[]
fh=open(fname)
for i in range(0,32):
thisline=fh.readline()
for j in range(0,32):
arr.append=(int(thisline[j])) #一行 所有列依次写入数组 末尾添加
return arr
arr1=datatoarray('E:/python/traindata/0_1.txt')
#建立一个函数读取文件前缀 即标签labels
def seplabel(fname):
filestr=fname.split('.')[0]
label=int(filestr.split('_')[0])
return label
#建立训练数据
def traindata():
labels=[]
trainfile=listdir('E:/python/traindata') #读取文件夹下面所有文件 按行
num=len(trainfile) #文件数即行数
#长度1024(列),每一行存储一个文件
#用一个数组存储所有训练数据 行:文件总数 列:1024
trainarr=zeros((num,1024)) #生成num行 1024列的矩阵或者向量
for i in range(1,num):
thisfname=trainfile[i]
thislabel=seplabel(thisfname)
labels.append(thislabel) #标签的添加 末尾形式
trainarr[i,:]=datatoarray('traindata/'+thisfname) #读取文件夹下所有文档
return trainarr,labels #trainarr是一个N*M的矩阵
#用测试数据调用KNN算法取测试,看是否能够准确识别
def datatest():
trainarr,labels=traindata()
testlist=listdir('testdata')
tnum=len(testlist)
for i in range(0,tnum):
thistestfile=testlist[i]
testarr=datatoarray('testdata/'+thistestfile) #测试数据只是一个1*N的向量
rknn=knn(3,testarr,trainarr,labels)
print(rknn)
datatest()