前言
学!先看了看西瓜书,一大堆的计算看的脑壳疼。
参考教材为机器学习实战。
环境搭建
anconda
先整个anaconda用来管理python环境,选择的版本是python3.9,Windows环境下在Anaconda Powershell Prompt执行命令验证安装:
然后创建一个新的环境:
conda create -n myenv sqlite
这里创建一个python3的环境:
conda create -n ml python=3
然后激活:
conda activate ml
通过list命令查看环境内安装的包:
在环境内使用的python为安装的3.10版本:
最后通过deactivate命令退出环境:
conda deactivate
tensorflow
安装参考,激活环境,先用search命令搜索一下可用的包:
conda search tensorflow
结果似乎没看到适合python3.10版本的包:
谨慎起见换个环境,退出环境后用remove命令删除环境:
conda remove -n ml --all
验证删除完成:
create一个新的环境,这次限定python版本为3.9:
conda create -n ml python=3.9
再次进入环境,使用conda install安装2.6.0版本的tensorflow:
conda install tensorflow=2.6.0
最后用list命令验证一下安装,import一下做个简单测试:
看起来没什么问题了。
keras
同样install一下就好了:
conda install keras
之后发现tensorflow好像自带了keras,又卸了。
numpy矩阵操作
from numpy import *
mat = mat(random.rand(4, 4))
print(mat)
invMat = mat.I
print(invMat)
myEye = mat * invMat
print(myEye)
itsEye = eye(4, 4)
print(itsEye)
print(myEye - itsEye)
运算时会存在计算误差。
k-近邻算法 kNN
首先是读取文件成一个矩阵:
def file2matrix(filename):
f = open(filename, "rb")
arrayoflines = f.readlines()
numberoflines = len(arrayoflines)
mymat = zeros((numberoflines, 13))
labels = []
index = 0
for line in arrayoflines:
line = line.strip()
listfromline = line.split(b",")
mymat[index,:] = listfromline[1:]
labels.append(int(listfromline[0]))
index += 1
return mymat, labels
然后为了不让数值较大的属性在计算距离的时候产生更大的影响,得做一下归一化处理:
def autoNorm(dataSet):
minvalue = dataSet.min(0)
maxvalue = dataSet.max(0)
ranges = maxvalue - minvalue
normdataset = zeros(shape(dataSet))
numberofrow = dataSet.shape[0]
normdataset = dataSet - tile(minvalue, (numberofrow, 1))
normdataset = normdataset / tile(ranges, (numberofrow, 1))
return normdataset
然后就是将数据集分成训练集和测试集两部分:
trainRatio = 0.7
myMat, labels = file2matrix("E:/dataSet/kNN/wine.data")
myMat = autoNorm(myMat)
index = 0
trainIndex = 0
testIndex = 0
rowNumber = myMat.shape[0]
trainMat = zeros((rowNumber, 13))
trainLabels = []
testMat = zeros((rowNumber, 13))
testLabels = []
for data in myMat:
if random.randint(1, 10) <= 10 * trainRatio:
trainMat[trainIndex] = data
trainLabels.append(labels[index])
trainIndex += 1
else:
testMat[testIndex] = data
testLabels.append(labels[index])
testIndex += 1
index += 1
trainMat = trainMat[~(trainMat==0).all(1)] # 删除多余的空行
testMat = testMat[~(testMat==0).all(1)]
要用kNN算法好像得装scikit-learn,装一个先。再进行训练测试:
kNN = KNeighborsClassifier(20)
kNN.fit(trainMat, trainLabels)
predictResult = kNN.predict(testMat)
errorCount = 0
index = 0
for result in predictResult:
print("the classifier came back, with: %d, the real answer is: %d" % (predictResult[index] ,testLabels[index]))
if (predictResult[index] != testLabels[index]):
errorCount += 1.0
index += 1
print("the total error rate is: %f" % (errorCount / float(testMat.shape[0])))
选用的k为20,最后的结果:
看起来还行。
后记
简单易懂的算法,但是数据集大起来就很难办了。
坏耶
电脑里的pycharm没有python3.9的代码提示,不清楚原因,可能pycharm版本低了也可能配置没调好。