好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Python機器學習之KNN近鄰算法

Python機器學習之KNN近鄰算法

熱門標簽:白銀外呼系統 公司電話機器人 騰訊外呼線路 陜西金融外呼系統 哈爾濱ai外呼系統定制 廣告地圖標注app 激戰2地圖標注 唐山智能外呼系統一般多少錢 海南400電話如何申請

一、KNN概述

簡單來說,K-近鄰算法采用測量不同特征值之間的距離方法進行分類

優點:精度高、對異常值不敏感、無數據輸入假定
缺點:計算復雜度高、空間復雜度高
適用數據范圍:數值型和標稱2型

工作原理:存在一個樣本數據集合,也稱為訓練樣本集,并且樣本集中每個數據都存在標簽,即我們知道樣本集中每一個數據與所屬分類的對應關系(訓練集)。輸入沒有標簽的新數據之后,將新數據的每個特征與樣本集中數據對應的特征進行比較,然后算法提取樣本集中特征最相似數據(最近鄰)的分類標簽(測試集)。一般來說,我們只選擇樣本數據集中前k個最相似的數據,這就是k-近鄰算法中k的出處。(通常k不大于20)

二、使用Python導入數據

我們先寫入一段代碼

from numpy import *		# 導入numpy模塊
import operator		# 導入operator模塊
def createDataSet():		# 創建數據集函數
	# 構建一個數組存放特征值
    group = array(
        [[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]
    )
    # 構建一個數組存放目標值
    labels = ['A', 'A', 'B', 'B']
    return group, labels

此處稍微介紹一下numpy這個包吧

三、numpy.array()

NumPy的主要對象是同種元素的多維數組。這是一個所有的元素都是一種類型、通過一個正整數元組索引的元素表格(通常是元素是數字)。
在NumPy中維度(dimensions)叫做軸(axes),軸的個數叫做秩(rank,但是和線性代數中的秩不是一樣的,在用python求線代中的秩中,我們用numpy包中的linalg.matrix_rank方法計算矩陣的秩
線性代數中秩的定義:設在矩陣A中有一個不等于0的r階子式D,且所有r+1階子式(如果存在的話)全等于0,那末D稱為矩陣A的最高階非零子式,數r稱為矩陣A的秩,記作R(A)。

四、實施KNN分類算法

依照KNN算法,我們依次來

先準備好四個需要的數據

  • inX:用于分類的輸入向量inX
  • dataSet:輸入的訓練樣本集dataSet
  • labels:標簽向量labels(元素數目和矩陣dataSet的行數相同)
  • k:選擇最近鄰居的數目

五、計算已知類別數據集中的點與當前點之間的距離

使用歐式距離:

六、完整代碼

# 返回矩陣的行數
dataSetSize = dataSet.shape[0]	
# 列數不變,行數變成dataSetSize列
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5

第一行

# 返回矩陣的行數
dataSetSize = dataSet.shape[0]	
# 以第一步的數據為例
answer:4		# 4行

第二行

inX = [1. , 0.]
# 列數不變,行數變成dataSetSize列
diffMat = tile(inX, (dataSetSize, 1)) - dataSet

# tile(inX, (dataSetSize, 1))
inX = [
	[1. , 0.],
	[1. , 0.],
	[1. , 0.],
	[1. , 0.]
]
# inX - dataSet兩個矩陣相減(行列相等相加相減才有意義)
dataSet = [
		[1. , 1.1],
        [1. , 1. ],
        [0. , 0. ],
        [0. , 0.1]
]
diffMat = [
	[0. , -1.1],
	[0. , -1.],
	[1. , 0.],
	[1. , -0.1]
]

第三行

# 求平方差
sqDiffMat = diffMat * 2

第四行

# 計算矩陣中每一行元素之和
# 此時會形成一個多行1列的矩陣
sqDistances = sqDiffMat.sum(axis=1)

第五行

# 開根號
distances = sqDistances**0.5

按照距離遞增次序排序

# 對數組進行排序
sortedDistIndicies = distances.argsort()

選擇與當前點距離最小的k個點

classCount = {}		# 新建一個字典
# 確定前k個距離最小元素所在的主要分類
for i in range(k):
	# voteIlabel的取值是labels中sortedDistIndicies[i]的位置
	voteIlabel = labels[sortedDistIndicies[i]]
	classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1

確定前k個點所在類別的出現概率

# 排序
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)

###11# 返回前k個點出現頻率最高的類別作為當前點的預測分類

return sortedClassCount[0][0]

剛剛試一試C++的版本…小心,救命

#include iostream>
#include vector>
#include algorithm>
#include cmath>
#include map>
int sum_vector(std::vectorint> v) {
	int sum = 0;
	for (int i = 0; i  v.size(); ++i) {
		sum = v[i] + sum;
	}
	return sum;
}
int knn(int k) {
	using std::cout;
	using std::endl;
	using std::vector;
	vectorvectorint>> x;	
	vectorint> x_sample = {2, 3, 4};	
	for (int i = 0; i  4; ++i) {
		x.push_back(x_sample);
	}
	vectorint> y = {1, 1, 1, 1};
	int dataSetSize = x.size();		

	vectorint> x_test = {4, 3, 4};
	vectorvectorint>> x_test_matrix;
	for (int i = 0; i  dataSetSize; ++i) {
		x_test_matrix.push_back(x_test);
	}
	vectorint> v_total;
	for (int i = 0; i  dataSetSize; ++i) {
		for (int j = 0; j  x_test_matrix[i].size(); ++j) {
			x_test_matrix[i][j] = x_test_matrix[i][j] - x[i][j];
			x_test_matrix[i][j] = x_test_matrix[i][j] * 2;
		}
		int sum_vec = sum_vector(x_test_matrix[i]);
		v_total.push_back(sqrt(sum_vec));
	}
	sort(v_total.begin(), v_total.end());
	std::mapint, int> mp;
	for (int i = 0; i  k; ++i) {
		int label = y[v_total[i]];
		mp[label] += 1;
	}
	int max_end_result = 0;
	for (std::mapint, int>::iterator it = mp.begin(); it != mp.end(); it++) {
		if (it->first > max_end_result) {
			max_end_result = it->first;
		}
	}
	return max_end_result;
}
int main() {
	int k = 12;
	int value = knn(k);
	std::cout  "result:\n"  std::endl;
	return 0;
}

七、數據處理、分析、測試

處理excel和txt數據

excel數據是矩陣數據,可直接使用,在此不做處理。

文本txt數據需要一些數據處理

def file2matrix(filename):
	fr = open(filename)
	# 讀取行數據直到尾部
	arrayOLines = fr.readlines()
	# 獲取行數
	numberOfLines = len(arrayOLines)
	# 創建返回shape為(numberOfLines, 3)numpy矩陣
	returnMat = zeros((numberOfLines, 3))
	classLabelVector = []
	index = 0
	for line in arrayOLines:
		# 去除首尾的回車符
		line = line.strip()
		# 以tab字符'\t'為符號進行分割字符串
		listFromLine = line.split('\t')
		# 選取前3個元素,把他們存儲到特征矩陣中
		returnMat[index, :] = listFromLine[0: 3]
		# 把目標變量放到目標數組中
		classLabelVector.append(int(listFromLine[-1]))
		index += 1
	return returnMat, classLabelVector

數據歸一化和標準化

在數值當中,會有一些數據大小參差不齊,嚴重影響數據的真實性,因此,對數據進行歸一化和標準化是使得數據取值在一定的區間,具有更好的擬合度。

例如歸一化就是將數據取值范圍處理為0到1或者-1到1之間

# max:最大特征值
# min:最小特征值
newValue = (oldValue - min)/(max-min)

寫個函數

def autoNorm(dataSet):
	# min(0)返回該矩陣中每一列的最小值
	minVals = dataSet.min(0)
	# max(0)返回該矩陣中每一列的最大值
	maxVals = dataSet.max(0)
	# 求出極值
	ranges = maxVals - minVals
	# 創建一個相同行列的0矩陣
	normDataSet = zeros(shape(dataSet))
	# 得到行數
	m = dataSet.shape[0]
	# 得到一個原矩陣減去m倍行1倍列的minVals
	normDataSet = dataSet - tile(minVlas, (m,1))
	# 特征值相除
	normDataSet = normDataSet/tile(ranges, (m, 1))
	return normDataSet, ranges, minVals

歸一化的缺點:如果異常值就是最大值或者最小值,那么歸一化也就沒有了保證(穩定性較差,只適合傳統精確小數據場景)

標準化可查

八、鳶尾花數據測試

既然已經了解其內置的算法了,那么便調庫來寫一個吧

from sklearn.datasets import load_iris      # 導入內置數據集
from sklearn.model_selection import train_test_split        # 提供數據集分類方法
from sklearn.preprocessing import StandardScaler        # 標準化
from sklearn.neighbors import KNeighborsClassifier      # KNN


def knn_iris():
    # 獲得鳶尾花數據集
    iris = load_iris()
    # 獲取數據集
    # random_state為隨機數種子,一個數據集中相等的行不能大于6
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)
    # 特征工程:標準化
    transfer = StandardScaler()
    # 訓練集標準化
    x_train = transfer.fit_transform(x_train)
    # 測試集標準化
    x_test = transfer.transform(x_test)
    # 設置近鄰個數
    estimator = KNeighborsClassifier(n_neighbors=3)
    # 訓練集測試形成模型
    estimator.fit(x_train, y_train)

    # 模型預估
    # 根據預測特征值得出預測目標值
    y_predict = estimator.predict(x_test)
    print("y_predict: \n", y_predict)
    # 得出預測目標值和真實目標值之間是否相等
    print("直接比對真實值和預測值:\n", y_test == y_predict)
    # 計算準確率
    score = estimator.score(x_test, y_test)
    print("準確率為:\n", score)


def main():
    knn_iris()


if __name__ == '__main__':
    main()

九、RESULT

到此這篇關于Python機器學習之KNN近鄰算法的文章就介紹到這了,更多相關Python近鄰算法內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python 機器學習工具包SKlearn的安裝與使用
  • Python機器學習算法之決策樹算法的實現與優缺點
  • Python機器學習三大件之一numpy
  • Python機器學習之決策樹
  • Python機器學習之Kmeans基礎算法
  • python機器學習之線性回歸詳解
  • python 機器學習的標準化、歸一化、正則化、離散化和白化
  • Python機器學習工具scikit-learn的使用筆記
  • python機器學習庫xgboost的使用
  • python機器學習實現決策樹
  • python機器學習包mlxtend的安裝和配置詳解
  • Python機器學習算法庫scikit-learn學習之決策樹實現方法詳解
  • Python機器學習之基礎概述

標簽:益陽 鷹潭 黔西 上海 常德 惠州 黑龍江 四川

巨人網絡通訊聲明:本文標題《Python機器學習之KNN近鄰算法》,本文關鍵詞  Python,機器,學,習之,KNN,近鄰,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python機器學習之KNN近鄰算法》相關的同類信息!
  • 本頁收集關于Python機器學習之KNN近鄰算法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 久热最新| 肉文动漫| 美女直播全婐app免费视频| 美美哒免费高清影院高清| zzijzzij亚洲日本护士| 女朋友中文字幕电影| 上课玩弄校花的粉嫩小泬漫画| 免费国精产品一二三区区别在哪| 老妇性老妇hd| 黄色a级片免费| 色播激情网| 多P混交群体交乱小说| 交换+np+h+乱+群| 人人揉人人捏人人添小说| 国产三级自拍| 乌克兰极品少妇XXXX做受| 欧美黑美人aaaa毛片野战| yin荡的玉足高跟小说| lesianjapanese| 女m跪着趴着被主人调教| 国产情侣久久久久AⅤ免费| 日韩精品导航| 宝贝快点让我爽| 黄色片网站免费| 欧美?无码黑人3p视频| 凹凸国产熟女精品视频国语| 国产一级婬片A片灌| yuliu的视频vk打屁股| japanesegay日本强迫类| 男j桶女p| 无码人妻精品一区二区三区潘金莲| 日本哺乳期水乳十大排行榜| 我就色色综合网| 亚洲看片| 久久精品国产电影| 一本一道久久久无码毛片A∨| 巜被褥里的人妻HD中字| 国产日韩免费视频| 国产破处在线视频| 蜜桃成熟时1997完整版下载 | ??成人9Ⅰ免费影视网站|