分类相似度:KNN算法笔记 K-近邻算法

分类相似度: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()
    

你可能感兴趣的:(分类相似度:KNN算法笔记 K-近邻算法)