勉強机(2):knn—近隣アルゴリズム

KNN


本文で私が紹介関数用法ながら彼を使用

準備は使用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このバッグだろう

実施knn分類アルゴリズム

knnアルゴリズムによって、我々の順に来

先の準備が四のデータが必要

  • inx:分類の入力用ベクトルinx
  • dataset:入力の訓練のサンプルの集dataset
  • labels:ラベルベクトルlabels(元素数、マトリックスdatasetの行数と同じ)
  • k:隣人選択が最近の数

距離ランキング下一页昭和记念公园花火大会花火序列通り

# 对数组进行排序
sortedDistIndicies = distances.argsort()

確定前に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::vector<int>& 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;
	vector<vector<int>> x;	
	vector<int> x_sample = {2, 3, 4};	
	for (int i = 0; i < 4; ++i) {
		x.push_back(x_sample);
	}
	vector<int> y = {1, 1, 1, 1};
	int dataSetSize = x.size();		

	vector<int> x_test = {4, 3, 4};
	vector<vector<int>> x_test_matrix;
	for (int i = 0; i < dataSetSize; ++i) {
		x_test_matrix.push_back(x_test);
	}
	vector<int> 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::map<int, 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::map<int, 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;
}

データを準備

データ帰一化や標準化

数値のうち、一部がデータの大きさが茂り、データの真実性に深刻な影響をため、データを帰一化、標準化とはデータ

例えば帰一化は、データ処理取值範囲をたりまで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

ソースネットワーク 戻る