机器学习-感知机笔记(题目举例和代码解答)
来源:互联网 发布:经济结构优化 编辑:程序博客网 时间:2024/05/16 06:40
1.题目
2.解答
#include<iostream>#include<vector>#include<string>#include<fstream>using namespace std;typedef vector<double> featureVct;typedef int label;class Perceptron;void printRes(Perceptron pp);class Perceptron{private:vector<featureVct> FtSet; //特征向量数据集vector<label> labelSet; //二分类label数据集 +1或-1double LearnRate;//学习率featureVct w;//感知机模型参数double bias;//偏置项int dimension;//特征向量维度int count;public:Perceptron(int dimension,featureVct w,double bias = 0.0,double learnRate = 1);int GetCount() const; //获取迭代次数const featureVct& GetW() const ; //获取模型参数void SetW(const featureVct& w); //设置模型参数double GetBias() const;//获取偏置项void SetBias(double bias);//设置骗置项bool ReadSource(const string& filePath); //读取数据源void Train();//训练模型,得到感知机模型public:double VectorDotProduct(const featureVct& f1, const featureVct& f2); //向量点积运算)featureVct VectorScalarMulti(double num, const featureVct f); //向量数乘运算featureVct VectorAdd(const featureVct& f1, const featureVct& f2); //向量加法运算};const featureVct& Perceptron::GetW() const{return w;}void Perceptron::SetW(const featureVct& w){this->w = w;}double Perceptron::GetBias() const{return bias;}void Perceptron::SetBias(double bias){this->bias = bias;}/*文件格式:每行表示一个样本点,特征值之间用空格隔开,最后一列存储类别信息1或-1*/bool Perceptron::ReadSource(const string& filePath){ifstream file(filePath);if (!file)return false;while (!file.eof()){featureVct dataTmp;double tmp;for (int i = 0; i < dimension; ++i){file >> tmp;dataTmp.push_back(tmp);}FtSet.push_back(dataTmp);label labelData;file >> labelData;labelSet.push_back(labelData);}return true;}void Perceptron::Train(){//感知机训练过程int flag = true;while (flag){for (int i = 0; i < FtSet.size(); i++){flag = false;if (labelSet[i] * (VectorDotProduct(w,FtSet[i]) + bias) <= 0){//此处的打印只是为了更直观的给大家展示学习过程,工程中最后不要直接在类中打印信息printRes(*this);flag = true;w = VectorAdd(w, VectorScalarMulti(labelSet[i]*LearnRate,FtSet[i]));bias += LearnRate * labelSet[i];++count;break;}}//此处的打印只是为了更直观的给大家展示学习过程,工程中最后不要直接在类中打印信息if(!flag) printRes(*this);}}Perceptron::Perceptron(int dimension, featureVct w, double bias, double learnRate){this->dimension = dimension;this->bias = bias;this->LearnRate = learnRate;this->w = w;count = 0;}double Perceptron::VectorDotProduct(const featureVct& f1, const featureVct& f2){double sum = 0.0;for (int i = 0; i != f1.size(); ++i){sum += f1[i] * f2[i];}return sum;}featureVct Perceptron::VectorScalarMulti(double num, const featureVct f){featureVct tmp;for (int i = 0; i != f.size(); ++i){tmp.push_back(num*f[i]);}return tmp;}featureVct Perceptron::VectorAdd(const featureVct& f1, const featureVct& f2){featureVct tmp(0);for (int i = 0; i != f1.size(); ++i){tmp.push_back(f1[i] + f2[i]);}return tmp;}int Perceptron::GetCount() const{return count;}void printRes(Perceptron pp){cout << "迭代次数:" << pp.GetCount() << endl;cout << "w:";featureVct tmp = pp.GetW();for (int i = 0; i < tmp.size() - 1; ++i){cout << tmp[i] << " ";}cout << tmp[tmp.size() - 1] << endl;cout << "bias:";cout << pp.GetBias() << endl;cout << "---------------------------" << endl;}int main(){featureVct w;w.push_back(0.0); //设置w初始化参数w.push_back(0.0);Perceptron pp(2, w); //创建特征向量为2维的感知机对象if (!pp.ReadSource("sun.txt")){cout << "读取文件失败";exit(-1);}pp.Train(); //训练得到感知机模型}
数据源:
3 3 14 3 11 1 -1
运行截图:
最后得到 w(1,1) b = -3
大家可能会问,这到底表示什么意思?
其实就是,得到的感知模型表达式为 f(x) = sign(x1+x2-3) 意思也就是我们得到了一条直线x+y-3 = 0 可以作为一个二类划分
注意:感知机器学习算法由于采用不同的初值或选取不同的误分类点,解可以不同
此题的详细解法描述参照《统计学习方法》赵航P45
阅读全文
0 0
- 机器学习-感知机笔记(题目举例和代码解答)
- 机器学习笔记(四) 感知机
- 机器学习-感知机笔记
- 机器学习——感知机(笔记+代码)
- 【机器学习系列】感知机学习代码
- 机器学习学习笔记3---感知机
- 机器学习笔记(XV)神经网络(II)感知机和多层网络
- 机器学习笔记(2)——感知机
- 机器学习基石笔记-感知机
- 机器学习笔记一:感知机
- 机器学习 - 感知机
- 机器学习 ---感知机
- 【机器学习】感知机学习---《统计学习方法》学习笔记
- 机器学习与神经网络(二):感知器的介绍和Python代码实现
- 机器学习(2)--感知机
- 机器学习-学习笔记(Java) 感知器(一)
- 机器学习中使用的神经网络第二讲笔记:神经网络的结构和感知机
- Python机器学习-感知机原理及代码实现
- Android Studio DDMS 无法查看/data目录
- SSM框架sql语句实现LIKE查询带特殊符号的语句
- 指针与数组的区别
- CImage 对话框初始化时候显示透明 PNG
- Ubuntu-install-keras-cuda-tensorflow/theano
- 机器学习-感知机笔记(题目举例和代码解答)
- 接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
- 八皇后问题
- java如何实现向word文档中插入柱状图,并更改颜色
- Windows10下虚拟机VMware10安装Centos7-网络配置篇
- 星河研究院:在自动驾驶领域到底是做青蛙还是做天鹅?(下)
- ABB收购B&R,重金补课“叫板”西门子
- 深度 | 火爆之后回归现实,聊天机器人应该如何重回巅峰?
- A系新品发布,微鲸表示“不能耍猴”