密码保护:生活记录:第一次仔细把玩四轴飞行器,呵呵
知识:图片解读机器学习[转载]
转载自:https://zhuanlan.zhihu.com/p/29440419?group_id=893138426625429504
听说你还不懂机器学习?图片解读基本概念、五大流派与九种常见算法
机器学习正在进步,我们似乎正在不断接近我们心中的人工智能目标。语音识别、图像检测、机器翻译、风格迁移等技术已经在我们的实际生活中开始得到了应用,但机器学习的发展仍还在继续,甚至被认为有可能彻底改变人类文明的发展方向乃至人类自身。但你了解现在正在发生的这场变革吗?四大会计师事务所之一的普华永道(PwC)近日发布了多份解读机器学习基础的图表,其中介绍了机器学习的基本概念、原理、历史、未来趋势和一些常见的算法。为便于读者阅读,机器之心对这些图表进行了编译和拆分,分三大部分对这些内容进行了呈现,其中也加入了一些扩展链接,希望能帮助你进一步扩展阅读。
一、机器学习概览
1. 什么是机器学习?
机器通过分析大量数据来进行学习。比如说,不需要通过编程来识别猫或人脸,它们可以通过使用图片来进行训练,从而归纳和识别特定的目标。
2. 机器学习和人工智能的关系
机器学习是一种重在寻找数据中的模式并使用这些模式来做出预测的研究和算法的门类。机器学习是人工智能领域的一部分,并且和知识发现与数据挖掘有所交集。更多解读可参阅《一文读懂机器学习、数据科学、人工智能、深度学习和统计学之间的区别》。
3. 机器学习的工作方式
①选择数据:将你的数据分成三组:训练数据、验证数据和测试数据
②模型数据:使用训练数据来构建使用相关特征的模型
③验证模型:使用你的验证数据接入你的模型
④测试模型:使用你的测试数据检查被验证的模型的表现
⑤使用模型:使用完全训练好的模型在新数据上做预测
⑥调优模型:使用更多数据、不同的特征或调整过的参数来提升算法的性能表现
发现:增程式电动车-混合动力电动车/摩托车
脑子中想了一个东西,即如果存在类似混合动力汽车一样的电动车或摩托车多好啊,即摩托车和电动车混合在一起。于是淘宝一搜,好家伙,真有!
宝贝还有视频介绍,那叫一个酷,看的我哈哈笑。这简直就是神器!摩托车、电动车合二为一了!可以切换纯电动模式,纯摩托模式,摩托+电动的混合模式!
Processing实现GameofLife
这是在Processing官网上找到的一个例子:A Processing implementation of Game of Life
程序源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
// Size of cells int cellSize = 5; // How likely for a cell to be alive at start (in percentage) float probabilityOfAliveAtStart = 15; // Variables for timer int interval = 100; int lastRecordedTime = 0; // Colors for active/inactive cells color alive = color(0, 200, 0); color dead = color(0); // Array of cells int[][] cells; // Buffer to record the state of the cells and use this while changing the others in the interations int[][] cellsBuffer; // Pause boolean pause = false; void setup() { size (640, 360); // Instantiate arrays cells = new int[width/cellSize][height/cellSize]; cellsBuffer = new int[width/cellSize][height/cellSize]; // This stroke will draw the background grid stroke(48); noSmooth(); // Initialization of cells for (int x=0; x<width/cellSize; x++) { for (int y=0; y<height/cellSize; y++) { float state = random (100); if (state > probabilityOfAliveAtStart) { state = 0; } else { state = 1; } cells[x][y] = int(state); // Save state of each cell } } background(0); // Fill in black in case cells don't cover all the windows } void draw() { //Draw grid for (int x=0; x<width/cellSize; x++) { for (int y=0; y<height/cellSize; y++) { if (cells[x][y]==1) { fill(alive); // If alive } else { fill(dead); // If dead } rect (x*cellSize, y*cellSize, cellSize, cellSize); } } // Iterate if timer ticks if (millis()-lastRecordedTime>interval) { if (!pause) { iteration(); lastRecordedTime = millis(); } } // Create new cells manually on pause if (pause && mousePressed) { // Map and avoid out of bound errors int xCellOver = int(map(mouseX, 0, width, 0, width/cellSize)); xCellOver = constrain(xCellOver, 0, width/cellSize-1); int yCellOver = int(map(mouseY, 0, height, 0, height/cellSize)); yCellOver = constrain(yCellOver, 0, height/cellSize-1); // Check against cells in buffer if (cellsBuffer[xCellOver][yCellOver]==1) { // Cell is alive cells[xCellOver][yCellOver]=0; // Kill fill(dead); // Fill with kill color } else { // Cell is dead cells[xCellOver][yCellOver]=1; // Make alive fill(alive); // Fill alive color } } else if (pause && !mousePressed) { // And then save to buffer once mouse goes up // Save cells to buffer (so we opeate with one array keeping the other intact) for (int x=0; x<width/cellSize; x++) { for (int y=0; y<height/cellSize; y++) { cellsBuffer[x][y] = cells[x][y]; } } } } void iteration() { // When the clock ticks // Save cells to buffer (so we opeate with one array keeping the other intact) for (int x=0; x<width/cellSize; x++) { for (int y=0; y<height/cellSize; y++) { cellsBuffer[x][y] = cells[x][y]; } } // Visit each cell: for (int x=0; x<width/cellSize; x++) { for (int y=0; y<height/cellSize; y++) { // And visit all the neighbours of each cell int neighbours = 0; // We'll count the neighbours for (int xx=x-1; xx<=x+1;xx++) { for (int yy=y-1; yy<=y+1;yy++) { if (((xx>=0)&&(xx<width/cellSize))&&((yy>=0)&&(yy<height/cellSize))) { // Make sure you are not out of bounds if (!((xx==x)&&(yy==y))) { // Make sure to to check against self if (cellsBuffer[xx][yy]==1){ neighbours ++; // Check alive neighbours and count them } } // End of if } // End of if } // End of yy loop } //End of xx loop // We've checked the neigbours: apply rules! if (cellsBuffer[x][y]==1) { // The cell is alive: kill it if necessary if (neighbours < 2 || neighbours > 3) { cells[x][y] = 0; // Die unless it has 2 or 3 neighbours } } else { // The cell is dead: make it live if necessary if (neighbours == 3 ) { cells[x][y] = 1; // Only if it has 3 neighbours } } // End of if } // End of y loop } // End of x loop } // End of function void keyPressed() { if (key=='r' || key == 'R') { // Restart: reinitialization of cells for (int x=0; x<width/cellSize; x++) { for (int y=0; y<height/cellSize; y++) { float state = random (100); if (state > probabilityOfAliveAtStart) { state = 0; } else { state = 1; } cells[x][y] = int(state); // Save state of each cell } } } if (key==' ') { // On/off of pause pause = !pause; } if (key=='c' || key == 'C') { // Clear all for (int x=0; x<width/cellSize; x++) { for (int y=0; y<height/cellSize; y++) { cells[x][y] = 0; // Save all to zero } } } } |
使用说明:
按空格键暂停,并可以用鼠标点击格子来激活/取消激活某个格点,再按空格继续。
按R键重置并随机生成一些格点。
按C清空所有格点。
请查看全文看在线展示。