前言

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

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


环境搭建

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版本低了也可能配置没调好。


参考文章

安装Anaconda1安装Anaconda2


机器学习

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

机器学习入门2
CVE-2020-13933 Shiro认证绕过