用python3來實現對機器學習實戰上面的例項

2021-08-18 22:14:51 字數 4105 閱讀 6009

這是我對機器學習實戰中的knn演算法實現,以及對**的理解。

首先我是用的資料集是機器學習實戰中的例項,我是用python3實現的。**以及檔案全部在我的github

首先我們這個演算法用的是歐氏距離公式,

我們平常所用的就是歐式距離公式,歐氏距離也可以用來求多個維度的點的距離。

首先讓我們引入所需要的包

from numpy import *

import operator

做乙個測試集

def

createdataset

(): group = array([[1.0, 1.1],[1.0, 1.1],[0, 0], [0, 0.1]])

labels = ['a', 'a', 'b', 'b']

return group, labels

測試一下這個**

group, labels = createdataset()

print(group)

print(labels)

[[1.

1.1]

[1.1.1]

[0.0. ]

[0.0.1]]

['a', 'a', 'b', 'b']

knn分類演算法

def

classify0

(inx, dataset, labels, k):

''' inx表示輸入向量

dataset是我們輸入的續聯樣本集

labels表示向量標籤

k 表示我們需要選出最小的k個值

'''datasetsize = dataset.shape[0] #datasetsize表示dataset資料集中的第一位的長度

diffmat = tile(inx, (datasetsize, 1)) - dataset #tile方法,這句話的含義表示生成乙個n行的陣列,其中每行都是inx,並且與訓練集相減

#求出距離

sqdiffmat = diffmat ** 2

sqdistance = sqdiffmat.sum(axis = 1)

distances = sqdistance ** 0.5

print(distances)

sorteddistindicies = distances.argsort() #argsort()方法表示,對距離從大到小排序,並且返回對應的序號

print(sorteddistindicies)

classcount =

# 選出距離最小的k個值

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]

classcount[voteilabel] = classcount.get(voteilabel, 0) + 1

sortedclasscount = sorted(classcount.items(), key = operator.itemgetter(1), reverse = true)

return sortedclasscount[0][0]

print(classify0([0, 0], group, labels, 3))
[1.48660687

1.48660687

0.0.1 ]

[230

1] b

輸入檔案得到訓練的資料集

def

file2matrix

(filename):

fr = open(filename) #開啟檔案

arrayolines = fr.readlines() #得到檔案的所有行

numberoflines = len(arrayolines) #得到檔案的行數

returnmat = zeros((numberoflines, 3)) #生成乙個numberofline行,3列的全為0的矩陣

classlabelvector =

index = 0

for line in arrayolines:

line = line.strip()

listfromline = line.split('\t')

returnmat[index,:] = listfromline[0:3] #取出特徵資料

index += 1

return returnmat, classlabelvector

對資料歸一化處理

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

#在資料中取出0.1的比例作為測試資料

datingdatamat, datinglabels = file2matrix('datingtestset.txt') #匯入資料

normmat, ranges, minvals = autonorm(datingdatamat) #歸一化處理

m = normmat.shape[0]

numtestvecs = int(m*horatio) #得到測試資料的總和

errorcount = 0.0

for i in range(numtestvecs):

#利用knn演算法分類

classifierresult = classify0(normmat[i, :], normmat[numtestvecs:m,:],\

datinglabels[numtestvecs:m], 3)

print("the classfier came back with: %s, the real answer is: %s"\

%(classifierresult, datinglabels[i]))

#統計錯誤的個數

if classifierresult != (datinglabels[i]):errorcount += 1.0

print('the total error rate is: %f' %(errorcount/float(numtestvecs)))

datingclasstest()

the classfier came back with:largedoses, the real answer is: largedoses

the classfier came back with:smalldoses, the real answer is: smalldoses

the classfier came back with:didntlike, the real answer is: didntlike..

.the classfier came back with:didntlike, the real answer is: didntlike

the classfier came back with:largedoses, the real answer is: didntlike

the total error rate is: 0.050000

我們得到了錯誤率為5%,這個演算法還行

素數對猜想之python3實現

題目 讓我們定義d n 為 d n p n 1 p n 其中p i 是第i個素數。顯然有d 1 1,且對於n 1有d n 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 請計算不超過n的滿足猜想的素數對的個數。輸入在一行給出正整數n。在一行中輸出不超過n的滿足猜想的素數...

python3使用importlib來重複載入模組

coding utf 8 from socketserver import threadingtcpserver,baserequesthandler import importlib import traceback import time import logging logging.basic...

python3實現CryptoJS AES加密演算法

from crypto.cipher import aes from binascii import b2a hex,a2b hex import base64 class aescrypt def init self,key self.key key.encode utf8 self.mode a...