机器学习入门1

前言

学!先看了看西瓜书,一大堆的计算看的脑壳疼。

参考教材为机器学习实战。


环境搭建

anconda

先整个anaconda用来管理python环境,选择的版本是python3.9,Windows环境下在Anaconda Powershell Prompt执行命令验证安装:

然后创建一个新的环境:

1
conda create -n myenv sqlite

这里创建一个python3的环境:

1
conda create -n ml python=3

然后激活:

1
conda activate ml

通过list命令查看环境内安装的包:

在环境内使用的python为安装的3.10版本:

最后通过deactivate命令退出环境:

1
conda deactivate

tensorflow

安装参考,激活环境,先用search命令搜索一下可用的包:

1
conda search tensorflow

结果似乎没看到适合python3.10版本的包:

谨慎起见换个环境,退出环境后用remove命令删除环境:

1
conda remove -n ml --all

验证删除完成:

create一个新的环境,这次限定python版本为3.9:

1
conda create -n ml python=3.9

再次进入环境,使用conda install安装2.6.0版本的tensorflow:

1
conda install tensorflow=2.6.0

最后用list命令验证一下安装,import一下做个简单测试:

看起来没什么问题了。

keras

同样install一下就好了:

1
conda install keras

之后发现tensorflow好像自带了keras,又卸了。

numpy矩阵操作

1
2
3
4
5
6
7
8
9
10
11
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

简单的分类算法,参考,数据集可以在这里下载。

首先是读取文件成一个矩阵:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

然后为了不让数值较大的属性在计算距离的时候产生更大的影响,得做一下归一化处理:

1
2
3
4
5
6
7
8
9
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

然后就是将数据集分成训练集和测试集两部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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,装一个先。再进行训练测试:

1
2
3
4
5
6
7
8
9
10
11
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版本低了也可能配置没调好。


参考文章

安装Anaconda1安装Anaconda2


机器学习入门1
http://yoursite.com/2021/12/08/机器学习入门1/
作者
Aluvion
发布于
2021年12月8日
许可协议