一.k-近邻算法电影类别分类
参照:博客一
实现代码
import numpy as np
import operator
def knn(trainData, testData, labels, k):
# 计算训练样本的行数
rowSize = trainData.shape[0]
# 计算训练样本和测试样本的差值
diff = np.tile(testData, (rowSize, 1)) - trainData
# 计算差值的平方和
sqrDiff = diff ** 2
sqrDiffSum = sqrDiff.sum(axis=1)
# 计算距离
distances = sqrDiffSum ** 0.5
# 对所得的距离从低到高进行排序
sortDistance = distances.argsort()
count = {}
for i in range(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]
trainData = np.array([[5, 8], [4, 1], [3, 3], [4, 4]])
labels = ['动作片', '动作片', '爱情片', '爱情片']
testData = [4, 2]
X = knn(trainData, testData, labels, 3)
print(X)
实验结果
二.手写识别系统
首先得有两个数据文件夹测试集和训练集(testDigits和trainingDigits里的数据要不一样),里面存放不同写法的数字。训练集中的数据作为训练样本 ,之后在测试集中检验?
需要识别的数字已经用图像处理软件处理过。如下图所示,具有相同的像素和形状:都是32像素×32像素的黑白图像。黑白像素分别由0和1表示. 然后再转换成文本存储形式存储。例如,如下三张图是直接从TEXT文档中截取的数字0,1,2
?
?代码
import numpy as np
from os import listdir
import knn as k
def classify0(inX,dataSet,labels,k):
dist=(((dataSet-inX)**2).sum(1))**0.5
sortedDist=dist.argsort()
classCount={}
for i in range(k):
voteLabel = labels[sortedDist[i]]
classCount[voteLabel]=classCount.get(voteLabel,0)+1
maxType=0
maxCount=-1
for key,value in classCount.items():
if value > maxCount:
maxType = key
maxCount = value
return maxType
def img2vector(filename):
returnVect = np.zeros((1, 1024))
fr = open(filename)
for i in range(32):
lineStr = fr.readline()
for j in range(32):
returnVect[0, 32 * i + j] = int(lineStr[j])
return returnVect
# load the training set
hwLabels = []
trainingFileList = listdir('D:/phycharm/test/trainingDigits')
m = len(trainingFileList)
trainingMat = np.zeros((m, 1024))
for i in range(m):
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
hwLabels.append(classNumStr)
trainingMat[i, :] = img2vector('D:/phycharm/test/trainingDigits/%s' % fileNameStr)
# iterate through the test set
testFileList = listdir('D:/phycharm/test/testDigits')
errorCount = 0.0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = img2vector('D:/phycharm/test/testDigits/%s' % fileNameStr)
classifierResult = k.knn(vectorUnderTest, trainingMat, hwLabels, 3)
print("辨识结果是: %d, 实际值是: %d" % (classifierResult, classNumStr))
if (classifierResult != classNumStr): errorCount += 1.0
print("\n辨识错误数量为: %d" % errorCount)
print("\n辨识率为: %f %" % ((1 - errorCount / float(mTest)) * 100))
实验结果
?参考视频学习:机器学习-分类算法及应用实践(四)手写字识别实战_哔哩哔哩_bilibili
三.KNN——约会网站的配对效果
(1)收集数据:提供文本文件。 (2)准备数据: python解析文本文件。 (3)分析数据:使用Matplotlib化画二维扩散图。 (4)训练算法:此步驟不适用于K-近邻算法。 (5)测试算法:使用提供的部分数据作为测试样本。测试样本和非测试样本的区别在于:测试样本是已经完成分类的数据,如果预测分类 与实际类别不同,则标记为一个错误。 (6)使用算法:产生简单的命令行程序,然后海伦可以输入一些特征数据以判断对方是否 为自己喜欢的类型 ?
1.从文本文件中解析数据源码:?
def file2matrix(filename):
fr = open(filename)
numberOfLines = len(fr.readlines())
returnMat = np.zeros((numberOfLines,3))
classLabelVector = []
fr = open(filename)
index = 0
for line in fr.readlines():
line = line.strip()
listFromLine = line.split('\t')
returnMat[index,:] = listFromLine[0:3]
if listFromLine[-1] == 'didntLike':
classLabelVector.append(1)
elif listFromLine[-1] == 'smallDoses':
classLabelVector.append(2)
elif listFromLine[-1] == 'largeDoses':
classLabelVector.append(3)
index += 1
return returnMat,classLabelVector
datingDataMat,datingLabels=file2matrix('D:/phycharm/test/Date/datingTestSet.txt')
print(datingDataMat)
print(datingLabels)
实验结果:
?2.使用Matplolib制作原始数据的散点图
fig=plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2])
plt.show()
散点图使用datingDataMat矩阵的第二、第三列数据,分别表示特征值“玩视频游戏所耗时间百分比” 和“每周所消费的冰淇淋公升数”
?3.归一化数值
源码:
def autoNorm(dataSet):
minVals=dataSet.min(0)
maxVals=dataSet.max(0)
ranges=maxVals-minVals
normDataSet = zeros(shape(dataSet))
m=dataSet.shape[0]
normDataSet=dataSet-tile(minVals,(m,1))
normDataSet=normDataSet/tile(ranges,(m,1))
return normDataSet,ranges,minVals
实验结果:
?分类器:
def datingClassTest():
hoRatio = 0.10
datingDataMat,datingLabels = file2matrix('D:/phycharm/test/Date/datingTestSet.txt')
normMat,ranges,minVals=autoNorm(datingDataMat)
m=normMat.shape[0]
numTestVecs = int(m*hoRatio)
errorCount=0.0
for i in range(numTestVecs):
classifierResult = k.knn(normMat[i,:],normMat[numTestVecs:m,:],\
datingLabels[numTestVecs:m],3)
print("the classifier came back with: %d, the real answer is : %d"\
%(classifierResult,datingLabels[i]))
if(classifierResult != datingLabels[i]):errorCount+=1.0
print("the total error rate is : %f" % (errorCount/float(numTestVecs)))
|